BackupPC-4.4.0/0000755000047500004750000000000013673511776012131 5ustar craigcraigBackupPC-4.4.0/conf/0000755000047500004750000000000013673511776013056 5ustar craigcraigBackupPC-4.4.0/conf/hosts0000444000047500004750000000424613673511776014145 0ustar craigcraig#============================================================= -*-perl-*- # # Host file list for BackupPC. # # DESCRIPTION # # This file lists all the hosts that should be backed up by # BackupPC. # # Each line in the hosts file contains three fields, separated # by white space: # # - The host name. If this host is a static IP address this # must the machine's IP host name (ie: something that can # be looked up using nslookup or DNS). If this is a DHCP # host then the host name must be the netbios name of the # machine. It is possible to have a host name that contains # spaces, but that is discouraged. Escape a space with "\", eg: # # craigs\ pc # # - DHCP flag. Set to 0 if this is a static IP address host # or if the machine can be found using nmblookup. Otherwise, # if the client can only be found by looking through the DHCP # pool then set this to 1. # # - User name (unix login/email name) of the user who "owns" # or uses this machine. This is the user who will be sent # email about this machine, and this user will have permission # to stop/start/browse/restore backups for this host. This # user name must match the name the user authenticates with # via apache. # # - Optional additional user names (comma separated, no white space) of # users who are also allowed to stop/start/browse/restore backups # for this client via the CGI interface. These users are not sent # email. These do not need to be valid email names; they simply # need to match the name the user authenticates with via apache. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # See http://backuppc.sourceforge.net. # #======================================================================== # # The first non-comment non-empty line gives the field names and should # not be edited!! # host dhcp user moreUsers # <--- do not edit this line #farside 0 craig jill,jeff # <--- example static IP host entry #larson 1 bill # <--- example DHCP host entry BackupPC-4.4.0/conf/sorttable.js0000444000047500004750000001575113673511776015422 0ustar craigcraig// Used with under license grant from http://kryogenix.org/code/browser/sorttable/ // Credit for this code goes to Stuart Langridge - http://kryogenix.org/contact addEvent(window, "load", sortables_init); var SORT_COLUMN_INDEX; function sortables_init() { // Find all tables with class sortable and make them sortable if (!document.getElementsByTagName) return; tbls = document.getElementsByTagName("table"); for (ti=0;ti 0) { // Find first table row with class sortheader for (var i=0;i' + txt+'   '; } } function ts_getInnerText(el) { if (typeof el == "string") return el; if (typeof el == "undefined") { return el }; // Not needed but it is faster. // We have to trim the content as some versions of Chrome append a trailing tab. if (el.innerText) return el.innerText.trim(); var str = ""; var cs = el.childNodes; var l = cs.length; for (var i = 0; i < l; i++) { switch (cs[i].nodeType) { case 1: //ELEMENT_NODE str += ts_getInnerText(cs[i]); break; case 3: //TEXT_NODE str += cs[i].nodeValue; break; } } return str; } function ts_resortTable(lnk,clid) { // get the span var span; for (var ci=0;ci * * COPYRIGHT * Copyright (C) 2004-2020 Craig Barratt */ body { font-family:arial,sans-serif; font-size:11pt; background-color:#ffffff; margin:2px 5px 0px 2px; height:100% } #logo-container a img { max-width: 151px; max-height: 47px; } h1 { font-family:arial,sans-serif; font-size:16pt; color:#000000 } h2 { font-family:arial,sans-serif; font-size:12pt; color:#000000 } a { font-family:arial,sans-serif; color:#3333ff } dt { color:#3333ff } a:hover { color:#cc0000; text-decoration:none } a.NavCurrent { font-weight:bold; } a.navbar { padding-left:5px; padding-right:5px; } .h1 { font-family:arial,sans-serif; font-size:16pt; color:#000000; font-weight:bold; background-color:#99cc33; padding:3px; padding-left:6px; margin-bottom:5px; } .h2 { font-family:arial,sans-serif; font-size:12pt; color:#000000; font-weight:bold; background-color:#ddeeee; padding:3px; padding-left:6px; margin-top:3px; margin-bottom:1px; } .tableStnd { font-size:11pt; } .tableheader { font-size:9pt; font-weight:bold; background-color:#cccccc; } .border { font-size:10pt; } .editHeader { font-family:arial,sans-serif; font-size:12pt; color:#000000; font-weight:bold; background-color:#99cc33; } .editTabSel { font-family:arial,sans-serif; font-size:14pt; color:#000000; font-weight:bold; background-color:#99cc33; padding:3px; padding-left:6px; margin-bottom:5px; } .editTabNoSel { font-family:arial,sans-serif; font-size:14pt; color:#000000; font-weight:bold; padding:3px; padding-left:6px; margin-bottom:5px; } .editSaveButton { color:#ff0000; font-size:14pt; font-weight:bold; } .editError { color:#ff0000; font-weight:bold; } .editComment { font-size:10pt; } .editTextInput { font-family:courier; } .fviewheader { font-weight:bold; font-size:10pt; color:#ffffff; background-color:#999999; } .fviewborder { border-bottom:1px solid #000000; border-left:1px dotted #666666; background-color:#dddddd; font-size:11pt; } .fviewon { background-color:#cccccc; } .fviewoff { background-color:#ffffff; } .fview { font-size:9pt; font-family:arial,sans-serif; text-decoration:none; line-height:15px; } .fviewbold { font-size:10pt; font-family:arial,sans-serif; text-decoration:none; line-height:15px; font-weight:bold; } .histView { border-bottom:1px solid #000000; border-left:2px solid #ffffff; background-color:#dddddd; font-size:10pt; } .histViewMis { border-bottom:1px solid #000000; background-color:#ffdddd; } div.NavMenu { width:18%; margin:0px; background-color:#ddeeee; } div.NavMenu a { font-size:10pt; display:block; margin-left:8px; padding:2px; } div.NavTitle { padding-left:10px; background-color:#99cc33; font-family:arial,sans-serif; color:#000000; font-weight:bold; margin-bottom:2px; } #Content { float:right; width:80%; left:20%; top:10px; position:absolute; } BackupPC-4.4.0/conf/BackupPC_retro_v3.css0000444000047500004750000001041213673511776017037 0ustar craigcraig/* * BackupPC standard CSS definitions * * Version 4.4.0, released 20 Jun 2020. * * See http://backuppc.sourceforge.net. * * AUTHOR * Craig Barratt * * COPYRIGHT * Copyright (C) 2004-2020 Craig Barratt */ body { font-family:tahoma,arial,sans-serif,helvetica; font-size:10pt; background-color:#ffffff; margin:2px 5px 0px 2px; height:100% } #logo-container a img { max-width: 151px; max-height: 47px; } table { border-collapse: collapse; color: #000000; padding: 2px; } h1 { font-family:Trebuchet MS,Trebuchet,tahoma,arial,sans-serif,helvetica; font-size:16pt; color:#000000 } h2 { font-family:Trebuchet MS,Trebuchet,tahoma,arial,sans-serif,helvetica; font-size:12pt; color:#000000 } a { font-family:tahoma,arial,sans-serif,helvetica; color:#3333ff } dt { color:#3333ff } pre { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ } a:hover { color:#cc0000; text-decoration:none } a.NavCurrent { font-weight:bold; } a.navbar { padding-left:5px; padding-right:5px; } .h1 { font-family:Trebuchet MS,Trebuchet,tahoma,arial,sans-serif,helvetica; font-size:16pt; color:#000000; font-weight:bold; background-color:#95B8DB; padding:3px; padding-left:6px; margin-bottom:5px; } .h2 { font-family:Trebuchet MS,Trebuchet,tahoma,arial,sans-serif,helvetica; font-size:12pt; color:#000000; font-weight:bold; background-color:#eeeeee; padding:3px; padding-left:6px; margin-top:3px; margin-bottom:1px; } .tableStnd { font-size:10pt; } .tableheader { font-size:10pt; font-weight:bold; background-color:#eeeeee; } table.sortable a.sortheader { background-color:#eeeeee; font-weight: bold; text-decoration: none; display: block; } .border { font-size:10pt; } .editHeader { font-family:arial,sans-serif; font-size:12pt; color:#000000; font-weight:bold; background-color:#95B8DB; } .editTabSel { font-family:arial,sans-serif; font-size:14pt; color:#000000; font-weight:bold; background-color:#95B8DB; padding:3px; padding-left:6px; margin-bottom:5px; } .editTabNoSel { font-family:arial,sans-serif; font-size:14pt; color:#000000; font-weight:bold; padding:3px; padding-left:6px; margin-bottom:5px; } .editSaveButton { color:#c0c0c0; font-size:14pt; font-weight:bold; } .editError { color:#ff0000; font-weight:bold; } .editComment { font-size:10pt; } .editTextInput { font-family:courier; font-size:10pt; } .fviewheader { font-weight:bold; font-size:9pt; color:#ffffff; background-color:#999999; } .fviewborder { border-left:1px solid #666666; border-bottom:1px solid #000000; border-right:1px solid #666666; background-color:#eeeeee; font-size:9pt; } .fviewon { background-color:#cccccc; } .fviewoff { background-color:#ffffff; } .fview { font-size:9pt; font-family:tahoma,arial,sans-serif,helvetica; text-decoration:none; line-height:15px; } .fviewbold { font-size:9pt; font-family:tahoma,arial,sans-serif,helvetica; text-decoration:none; line-height:15px; font-weight:bold; } .histView { border-bottom:1px solid #000000; border-left:1px solid #000000; background-color:#eeeeee; font-size:10pt; } .histViewMis { border-bottom:1px solid #000000; border-left:1px solid #000000; background-color:#ffdddd; } div.NavMenu { width:18%; margin:0px; font-size:9pt; background-color:#eeeeee; } div.NavMenu a { font-size:9pt; font-family:arial,sans-serif; display:block; margin-left:8px; padding:2px; } div.NavTitle { font-size:12pt; padding-left:10px; background-color:#95B8DB; font-family:Trebuchet MS,Trebuchet,tahoma,arial,sans-serif,helvetica; color:#000000; font-weight:bold; margin-bottom:2px; } #Content { float:right; width:79%; left:20%; top:10px; right:10px; position:absolute; } BackupPC-4.4.0/conf/config.pl0000444000047500004750000025360213673511776014666 0ustar craigcraig#============================================================= -*-perl-*- # # Configuration file for BackupPC. # # DESCRIPTION # # This is the main configuration file for BackupPC. # # This file must be valid perl source, so make sure the punctuation, # quotes, and other syntax are valid. # # This file is read by BackupPC at startup, when a HUP (-1) signal # is sent to BackupPC and also at each wakeup time whenever the # modification time of this file changes. # # The configuration parameters are divided into four general groups. # The first group (general server configuration) provides general # configuration for BackupPC. The next two groups describe what # to backup, when to do it, and how long to keep it. The fourth # group are settings for the CGI http interface. # # Configuration settings can also be specified on a per-PC basis. # Simply put the relevant settings in a config.pl file in the # PC's backup directory (ie: in __TOPDIR__/pc/hostName). # All configuration settings in the second, third and fourth # groups can be overridden by the per-PC config.pl file. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # See https://backuppc.github.io/backuppc # #======================================================================== ########################################################################### # General server configuration ########################################################################### # # Host name on which the BackupPC server is running. # $Conf{ServerHost} = ''; # # TCP port number on which the BackupPC server listens for and accepts # connections. Normally this should be disabled (set to -1). The TCP # port is only needed if apache runs on a different machine from BackupPC. # In that case, set this to any spare port number over 1024 (eg: 2359). # If you enable the TCP port, make sure you set $Conf{ServerMesgSecret} # too! # $Conf{ServerPort} = -1; # # Shared secret to make the TCP port secure. Set this to a hard to guess # string if you enable the TCP port (ie: $Conf{ServerPort} > 0). # # To avoid possible attacks via the TCP socket interface, every client # message is protected by an MD5 digest. The MD5 digest includes four # items: # - a seed that is sent to the client when the connection opens # - a sequence number that increments for each message # - a shared secret that is stored in $Conf{ServerMesgSecret} # - the message itself. # # The message is sent in plain text preceded by the MD5 digest. A # snooper can see the plain-text seed sent by BackupPC and plain-text # message from the client, but cannot construct a valid MD5 digest since # the secret $Conf{ServerMesgSecret} is unknown. A replay attack is # not possible since the seed changes on a per-connection and # per-message basis. # $Conf{ServerMesgSecret} = ''; # # PATH setting for BackupPC. An explicit value is necessary # for taint mode. Value shouldn't matter too much since # all execs use explicit paths. However, taint mode in perl # will complain if this directory is world writable. # $Conf{MyPath} = '/bin'; # # Permission mask for directories and files created by BackupPC. # Default value prevents any access from group other, and prevents # group write. # $Conf{UmaskMode} = 027; # # Times at which we wake up, check all the PCs, and schedule necessary # backups. Times are measured in hours since midnight local time. # Can be fractional if necessary (eg: 4.25 means 4:15am). # # If the hosts you are backing up are always connected to the network # you might have only one or two wakeups each night. This will keep # the backup activity after hours. On the other hand, if you are backing # up laptops that are only intermittently connected to the network you # will want to have frequent wakeups (eg: hourly) to maximize the chance # that each laptop is backed up. # # Examples: # $Conf{WakeupSchedule} = [22.5]; # once per day at 10:30 pm. # $Conf{WakeupSchedule} = [2,4,6,8,10,12,14,16,18,20,22]; # every 2 hours # # The default value is every hour except midnight. # # The first entry of $Conf{WakeupSchedule} is when BackupPC_nightly is run. # You might want to re-arrange the entries in $Conf{WakeupSchedule} # (they don't have to be ascending) so that the first entry is when # you want BackupPC_nightly to run (eg: when you don't expect a lot # of regular backups to run). # $Conf{WakeupSchedule} = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]; # # If a V3 pool exists (ie: an upgrade) set this to 1. This causes the # V3 pool to be checked for matches if there are no matches in the V4 # pool. # # For new installations, this should be set to 0. # $Conf{PoolV3Enabled} = 0; # # Maximum number of simultaneous backups to run. If there # are no user backup requests then this is the maximum number # of simultaneous backups. # $Conf{MaxBackups} = 4; # # Additional number of simultaneous backups that users can run. # As many as $Conf{MaxBackups} + $Conf{MaxUserBackups} requests can # run at the same time. # $Conf{MaxUserBackups} = 4; # # Maximum number of pending link commands. New backups will only be # started if there are no more than $Conf{MaxPendingCmds} plus # $Conf{MaxBackups} number of pending link commands, plus running jobs. # This limit is to make sure BackupPC doesn't fall too far behind in # running BackupPC_link commands. # $Conf{MaxPendingCmds} = 15; # # Nice level at which CmdQueue commands (eg: BackupPC_link and # BackupPC_nightly) are run at. # $Conf{CmdQueueNice} = 10; # # How many BackupPC_nightly processes to run in parallel. # # Each night, at the first wakeup listed in $Conf{WakeupSchedule}, # BackupPC_nightly is run. Its job is to remove unneeded files # in the pool, ie: files that only have one link. To avoid race # conditions, BackupPC_nightly and BackupPC_link cannot run at # the same time. Starting in v3.0.0, BackupPC_nightly can run # concurrently with backups (BackupPC_dump). # # So to reduce the elapsed time, you might want to increase this # setting to run several BackupPC_nightly processes in parallel # (eg: 4, or even 8). # $Conf{MaxBackupPCNightlyJobs} = 2; # # How many days (runs) it takes BackupPC_nightly to traverse the # entire pool. Normally this is 1, which means every night it runs, # it does traverse the entire pool removing unused pool files. # # Other valid values are 2, 4, 8, 16. This causes BackupPC_nightly to # traverse 1/2, 1/4, 1/8 or 1/16th of the pool each night, meaning it # takes 2, 4, 8 or 16 days to completely traverse the pool. The # advantage is that each night the running time of BackupPC_nightly # is reduced roughly in proportion, since the total job is split # over multiple days. The disadvantage is that unused pool files # take longer to get deleted, which will slightly increase disk # usage. # # Note that even when $Conf{BackupPCNightlyPeriod} > 1, BackupPC_nightly # still runs every night. It just does less work each time it runs. # # Examples: # # $Conf{BackupPCNightlyPeriod} = 1; # entire pool is checked every night # # $Conf{BackupPCNightlyPeriod} = 2; # two days to complete pool check # # (different half each night) # # $Conf{BackupPCNightlyPeriod} = 4; # four days to complete pool check # # (different quarter each night) # $Conf{BackupPCNightlyPeriod} = 1; # # The total size of the files in the new V4 pool is updated every # night when BackupPC_nightly runs BackupPC_refCountUpdate. Instead # of adding up the size of every pool file, it just updates the pool # size total when files are added to or removed from the pool. # # To make sure these cumulative pool file sizes stay accurate, we # recompute the V4 pool size for a portion of the pool each night # from scratch, ie: by checking every file in that portion of the # pool. # # $Conf{PoolSizeNightlyUpdatePeriod} sets how many nights it takes # to completely update the V4 pool size. It can be set to: # 0: never do a full refresh; simply maintain the cumulative sizes # when files are added or deleted (fastest option) # 1: recompute all the V4 pool size every night (slowest option) # 2: recompute 1/2 the V4 pool size every night # 4: recompute 1/4 the V4 pool size every night # 8: recompute 1/8 the V4 pool size every night # 16: recompute 1/16 the V4 pool size every night # (2nd fastest option; ensures the pool files sizes # stay accurate after a few day, in case the relative # upgrades miss a file) # $Conf{PoolSizeNightlyUpdatePeriod} = 16; # # Integrity check the pool files by confirming the md5 digest of the # contents matches their file name. Because the pool is very large, # only check a small random percentage of the pool files each night. # # This is check if there has been any server file system corruption. # # The default value of 1% means approximately 30% of the pool files # will be checked each month, although the actual number will be a # bit less since some files might be checked more than once in that # time. If BackupPC_nightly takes too long, you could reduce this # value. # $Conf{PoolNightlyDigestCheckPercent} = 1; # # Reference counts of pool files are computed per backup by accumulating # the relative changes. That means, however, that any error will never be # corrected. To be more conservative, we do a periodic full-redo of the # backup reference counts (called an "fsck"). $Conf{RefCntFsck} controls # how often this is done: # # 0: no additional fsck # 1: do an fsck on the last backup if it is from a full backup # 2: do an fsck on the last two backups always # 3: do a full fsck on all the backups # # $Conf{RefCntFsck} = 1 is the recommended setting. # $Conf{RefCntFsck} = 1; # # Maximum number of log files we keep around in log directory. # These files are aged nightly. A setting of 14 means the log # directory will contain about 2 weeks of old log files, in # particular at most the files LOG, LOG.0, LOG.1, ... LOG.13 # (except today's LOG, these files will have a .z extension if # compression is on). # # If you decrease this number after BackupPC has been running for a # while you will have to manually remove the older log files. # $Conf{MaxOldLogFiles} = 14; # # Full path to the df command. Security caution: normal users # should not allowed to write to this file or directory. # $Conf{DfPath} = ''; # # Command to run df. The following variables are substituted at run-time: # # $dfPath path to df ($Conf{DfPath}) # $topDir top-level BackupPC data directory # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{DfCmd} = '$dfPath $topDir'; # # Command to run df to get inode % usage. The following variables are substituted # at run-time: # # $dfPath path to df ($Conf{DfPath}) # $topDir top-level BackupPC data directory # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{DfInodeUsageCmd} = '$dfPath -i $topDir'; # # Full path to various commands for archiving # $Conf{SplitPath} = ''; $Conf{ParPath} = ''; $Conf{CatPath} = ''; $Conf{GzipPath} = ''; $Conf{Bzip2Path} = ''; # # Maximum threshold for disk utilization on the __TOPDIR__ filesystem. # If the output from $Conf{DfCmd} reports a percentage larger than # this number then no new regularly scheduled backups will be run. # However, user requested backups (which are usually incremental and # tend to be small) are still performed, independent of disk usage. # Also, currently running backups will not be terminated when the disk # usage exceeds this number. # $Conf{DfMaxUsagePct} = 95; # # Maximum threshold for inode utilization on the __TOPDIR__ filesystem. # If the output from $Conf{DfInodeUsageCmd} reports a percentage larger # than this number then no new regularly scheduled backups will be run. # However, user requested backups (which are usually incremental and # tend to be small) are still performed, independent of disk usage. # Also, currently running backups will not be terminated when the disk # inode usage exceeds this number. # $Conf{DfMaxInodeUsagePct} = 95; # # List of DHCP address ranges we search looking for PCs to backup. # This is an array of hashes for each class C address range. # This is only needed if hosts in the conf/hosts file have the # dhcp flag set. # # Examples: # # to specify 192.10.10.20 to 192.10.10.250 as the DHCP address pool # $Conf{DHCPAddressRanges} = [ # { # ipAddrBase => '192.10.10', # first => 20, # last => 250, # }, # ]; # # to specify two pools (192.10.10.20-250 and 192.10.11.10-50) # $Conf{DHCPAddressRanges} = [ # { # ipAddrBase => '192.10.10', # first => 20, # last => 250, # }, # { # ipAddrBase => '192.10.11', # first => 10, # last => 50, # }, # ]; # $Conf{DHCPAddressRanges} = []; # # The BackupPC user. # $Conf{BackupPCUser} = ''; # # Important installation directories: # # TopDir - where all the backup data is stored # ConfDir - where the main config and hosts files resides # LogDir - where log files and other transient information resides # RunDir - where pid and sock files reside # InstallDir - where the bin, lib and doc installation dirs reside. # Note: you cannot change this value since all the # perl scripts include this path. You must reinstall # with configure.pl to change InstallDir. # CgiDir - Apache CGI directory for BackupPC_Admin # # Note: it is STRONGLY recommended that you don't change the # values here. These are set at installation time and are here # for reference and are used during upgrades. # # Instead of changing TopDir here it is recommended that you use # a symbolic link to the new location, or mount the new BackupPC # store at the existing $Conf{TopDir} setting. # $Conf{TopDir} = ''; $Conf{ConfDir} = ''; $Conf{LogDir} = ''; $Conf{RunDir} = ''; $Conf{InstallDir} = ''; $Conf{CgiDir} = ''; # # Whether BackupPC and the CGI script BackupPC_Admin verify that they # are really running as user $Conf{BackupPCUser}. If this flag is set # and the effective user id (euid) differs from $Conf{BackupPCUser} # then both scripts exit with an error. This catches cases where # BackupPC might be accidentally started as root or the wrong user, # or if the CGI script is not installed correctly. # $Conf{BackupPCUserVerify} = 1; # # Maximum number of hardlinks supported by the $TopDir file system # that BackupPC uses. Most linux or unix file systems should support # at least 32000 hardlinks per file, or 64000 in other cases. If a pool # file already has this number of hardlinks, a new pool file is created # so that new hardlinks can be accommodated. This limit will only # be hit if an identical file appears at least this number of times # across all the backups. # $Conf{HardLinkMax} = 31999; # # Advanced option for asking BackupPC to load additional perl modules. # Can be a list (arrayref) of module names to load at startup. # $Conf{PerlModuleLoad} = undef; # # Path to init.d script and command to use that script to start the # server from the CGI interface. The following variables are substituted # at run-time: # # $sshPath path to ssh ($Conf{SshPath}) # $serverHost same as $Conf{ServerHost} # $serverInitdPath path to init.d script ($Conf{ServerInitdPath}) # # Example: # # $Conf{ServerInitdPath} = '/etc/init.d/backuppc'; # $Conf{ServerInitdStartCmd} = '$sshPath -q -x -l root $serverHost' # . ' $serverInitdPath start' # . ' < /dev/null >& /dev/null'; # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{ServerInitdPath} = ''; $Conf{ServerInitdStartCmd} = ''; ########################################################################### # What to backup and when to do it # (can be overridden in the per-PC config.pl) ########################################################################### # # Minimum period in days between full backups. A full dump will only be # done if at least this much time has elapsed since the last full dump, # and at least $Conf{IncrPeriod} days has elapsed since the last # successful dump. # # Typically this is set slightly less than an integer number of days. The # time taken for the backup, plus the granularity of $Conf{WakeupSchedule} # will make the actual backup interval a bit longer. # $Conf{FullPeriod} = 6.97; # # Minimum period in days between incremental backups (a user requested # incremental backup will be done anytime on demand). # # Typically this is set slightly less than an integer number of days. The # time taken for the backup, plus the granularity of $Conf{WakeupSchedule} # will make the actual backup interval a bit longer. # $Conf{IncrPeriod} = 0.97; # # In V4+, full/incremental backups are decoupled from whether the stored # backup is filled/unfilled. # # To mimic V3 behaviour, if $Conf{FillCycle} is set to zero then fill/unfilled # will continue to match full/incremental: full backups will remained filled, # and incremental backups will be unfilled. (However, the most recent # backup is always filled, whether it is full or incremental.) This is # the recommended setting to keep things simple: since the backup expiry # is actually done based on filled/unfilled (not full/incremental), keeping # them synched makes it easier to understand the expiry settings. # # If you plan to do incremental-only backups (ie: set FullPeriod to a very # large value), then you should set $Conf{FillCycle} to how often you # want a stored backup to be filled. For example, if $Conf{FillCycle} is # set to 7, then every 7th backup will be filled (whether or not the # corresponding backup was a full or not). # # There are two reasons you will want a non-zero $Conf{FillCycle} setting # when you are only doing incrementals: # # - a filled backup is a starting point for merging deltas when you restore # or view backups. So having periodic filled backups makes it more # efficient to view or restore older backups. # # - more importantly, in V4+, deleting backups is done based on Fill/Unfilled, # not whether the original backup was full/incremental. If there aren't any # filled backups (other than the most recent), then the $Conf{FullKeepCnt} # and related settings won't have any effect. # $Conf{FillCycle} = 0; # # Number of filled backups to keep. Must be >= 1. # # The most recent backup (which is always filled) doesn't count when # checking $Conf{FullKeepCnt}. So if you specify $Conf{FullKeepCnt} = 1 # then that means keep one full backup in addition to the most recent # backup (which might be a filled incr or full). # # Note: Starting in V4+, deleting backups is done based on Fill/Unfilled, # not whether the original backup was full/incremental. For backward # compatibility, these parameters continue to be called FullKeepCnt, rather # than FilledKeepCnt. If $Conf{FillCycle} is 0, then full backups continue # to be filled, so the terms are interchangeable. For V3 backups, # the expiry settings have their original meanings. # # In the steady state, each time a full backup completes successfully # the oldest one is removed. If this number is decreased, the # extra old backups will be removed. # # Exponential backup expiry is also supported. This allows you to specify: # # - num fulls to keep at intervals of 1 * $Conf{FillCycle}, followed by # - num fulls to keep at intervals of 2 * $Conf{FillCycle}, # - num fulls to keep at intervals of 4 * $Conf{FillCycle}, # - num fulls to keep at intervals of 8 * $Conf{FillCycle}, # - num fulls to keep at intervals of 16 * $Conf{FillCycle}, # # and so on. This works by deleting every other full as each expiry # boundary is crossed. Note: if $Conf{FillCycle} is 0, then # $Conf{FullPeriod} is used instead in these calculations. # # Exponential expiry is specified using an array for $Conf{FullKeepCnt}: # # $Conf{FullKeepCnt} = [4, 2, 3]; # # Entry #n specifies how many fulls to keep at an interval of # 2^n * $Conf{FillCycle} (ie: 1, 2, 4, 8, 16, 32, ...). # # The example above specifies keeping 4 of the most recent full backups # (1 week interval) two full backups at 2 week intervals, and 3 full # backups at 4 week intervals, eg: # # full 0 19 weeks old \ # full 1 15 weeks old >--- 3 backups at 4 * $Conf{FillCycle} # full 2 11 weeks old / # full 3 7 weeks old \____ 2 backups at 2 * $Conf{FillCycle} # full 4 5 weeks old / # full 5 3 weeks old \ # full 6 2 weeks old \___ 4 backups at 1 * $Conf{FillCycle} # full 7 1 week old / # full 8 current / # # On a given week the spacing might be less than shown as each backup # ages through each expiry period. For example, one week later, a # new full is completed and the oldest is deleted, giving: # # full 0 16 weeks old \ # full 1 12 weeks old >--- 3 backups at 4 * $Conf{FillCycle} # full 2 8 weeks old / # full 3 6 weeks old \____ 2 backups at 2 * $Conf{FillCycle} # full 4 4 weeks old / # full 5 3 weeks old \ # full 6 2 weeks old \___ 4 backups at 1 * $Conf{FillCycle} # full 7 1 week old / # full 8 current / # # You can specify 0 as a count (except in the first entry), and the # array can be as long as you wish. For example: # # $Conf{FullKeepCnt} = [4, 0, 4, 0, 0, 2]; # # This will keep 10 full dumps, 4 most recent at 1 * $Conf{FillCycle}, # followed by 4 at an interval of 4 * $Conf{FillCycle} (approx 1 month # apart), and then 2 at an interval of 32 * $Conf{FillCycle} (approx # 7-8 months apart). # # Example: these two settings are equivalent and both keep just # the four most recent full dumps: # # $Conf{FullKeepCnt} = 4; # $Conf{FullKeepCnt} = [4]; # $Conf{FullKeepCnt} = 1; # # Very old full backups are removed after $Conf{FullAgeMax} days. However, # we keep at least $Conf{FullKeepCntMin} full backups no matter how old # they are. # # Note that $Conf{FullAgeMax} will be increased to $Conf{FullKeepCnt} # times $Conf{FillCycle} if $Conf{FullKeepCnt} specifies enough # full backups to exceed $Conf{FullAgeMax}. # $Conf{FullKeepCntMin} = 1; $Conf{FullAgeMax} = 180; # # Number of incremental backups to keep. Must be >= 1. # # Note: Starting in V4+, deleting backups is done based on Fill/Unfilled, # not whether the original backup was full/incremental. For historical # reasons these parameters continue to be called IncrKeepCnt, rather than # UnfilledKeepCnt. If $Conf{FillCycle} is 0, then incremental backups # continue to be unfilled, so the terms are interchangeable. For V3 backups, # the expiry settings have their original meanings. # # In the steady state, each time an incr backup completes successfully # the oldest one is removed. If this number is decreased, the # extra old backups will be removed. # $Conf{IncrKeepCnt} = 6; # # Very old incremental backups are removed after $Conf{IncrAgeMax} days. # However, we keep at least $Conf{IncrKeepCntMin} incremental backups no # matter how old they are. # $Conf{IncrKeepCntMin} = 1; $Conf{IncrAgeMax} = 30; # # Disable all full and incremental backups. These settings are # useful for a client that is no longer being backed up # (eg: a retired machine), but you wish to keep the last # backups available for browsing or restoring to other machines. # # There are three values for $Conf{BackupsDisable}: # # 0 Backups are enabled. # # 1 Don't do any regular backups on this client. Manually # requested backups (via the CGI interface) will still occur. # # 2 Don't do any backups on this client. Manually requested # backups (via the CGI interface) will be ignored. # # In versions prior to 3.0 Backups were disabled by setting # $Conf{FullPeriod} to -1 or -2. # $Conf{BackupsDisable} = 0; # # Number of restore logs to keep. BackupPC remembers information about # each restore request. This number per client will be kept around before # the oldest ones are pruned. # # Note: files/dirs delivered via Zip or Tar downloads don't count as # restores. Only the first restore option (where the files and dirs # are written to the host) count as restores that are logged. # $Conf{RestoreInfoKeepCnt} = 10; # # Number of archive logs to keep. BackupPC remembers information # about each archive request. This number per archive client will # be kept around before the oldest ones are pruned. # $Conf{ArchiveInfoKeepCnt} = 10; # # List of directories or files to backup. If this is defined, only these # directories or files will be backed up. # # For Smb, only one of $Conf{BackupFilesExclude} and $Conf{BackupFilesOnly} # can be specified per share. If both are set for a particular share, then # $Conf{BackupFilesOnly} takes precedence and $Conf{BackupFilesExclude} # is ignored. # # This can be set to a string, an array of strings, or, in the case # of multiple shares, a hash of strings or arrays. A hash is used # to give a list of directories or files to backup for each share # (the share name is the key). If this is set to just a string or # array, and $Conf{SmbShareName} contains multiple share names, then # the setting is assumed to apply all shares. # # If a hash is used, a special key "*" means it applies to all # shares that don't have a specific entry. # # Examples: # $Conf{BackupFilesOnly} = '/myFiles'; # $Conf{BackupFilesOnly} = ['/myFiles']; # same as first example # $Conf{BackupFilesOnly} = ['/myFiles', '/important']; # $Conf{BackupFilesOnly} = { # 'c' => ['/myFiles', '/important'], # these are for 'c' share # 'd' => ['/moreFiles', '/archive'], # these are for 'd' share # }; # $Conf{BackupFilesOnly} = { # 'c' => ['/myFiles', '/important'], # these are for 'c' share # '*' => ['/myFiles', '/important'], # these are other shares # }; # $Conf{BackupFilesOnly} = undef; # # List of directories or files to exclude from the backup. For Smb, # only one of $Conf{BackupFilesExclude} and $Conf{BackupFilesOnly} # can be specified per share. If both are set for a particular share, # then $Conf{BackupFilesOnly} takes precedence and # $Conf{BackupFilesExclude} is ignored. # # This can be set to a string, an array of strings, or, in the case # of multiple shares, a hash of strings or arrays. A hash is used # to give a list of directories or files to exclude for each share # (the share name is the key). If this is set to just a string or # array, and $Conf{SmbShareName} contains multiple share names, then # the setting is assumed to apply to all shares. # # The exact behavior is determined by the underlying transport program, # smbclient or tar. For smbclient the exclude file list is passed into # the X option. Simple shell wild-cards using "*" or "?" are allowed. # # For tar, if the exclude file contains a "/" it is assumed to be anchored # at the start of the string. Since all the tar paths start with "./", # BackupPC prepends a "." if the exclude file starts with a "/". Note # that GNU tar version >= 1.13.7 is required for the exclude option to # work correctly. For linux or unix machines you should add # "/proc" to $Conf{BackupFilesExclude} unless you have specified # --one-file-system in $Conf{TarClientCmd} or --one-file-system in # $Conf{RsyncArgs}. Also, for tar, do not use a trailing "/" in # the directory name: a trailing "/" causes the name to not match # and the directory will not be excluded. # # Users report that for smbclient you should specify a directory # followed by "/*", eg: "/proc/*", instead of just "/proc". # # FTP servers are traversed recursively so excluding directories will # also exclude its contents. You can use the wildcard characters "*" # and "?" to define files for inclusion and exclusion. Both # attributes $Conf{BackupFilesOnly} and $Conf{BackupFilesExclude} can # be defined for the same share. # # If a hash is used, a special key "*" means it applies to all # shares that don't have a specific entry. # # Examples: # $Conf{BackupFilesExclude} = '/temp'; # $Conf{BackupFilesExclude} = ['/temp']; # same as first example # $Conf{BackupFilesExclude} = ['/temp', '/winnt/tmp']; # $Conf{BackupFilesExclude} = { # 'c' => ['/temp', '/winnt/tmp'], # these are for 'c' share # 'd' => ['/junk', '/dont_back_this_up'], # these are for 'd' share # }; # $Conf{BackupFilesExclude} = { # 'c' => ['/temp', '/winnt/tmp'], # these are for 'c' share # '*' => ['/junk', '/dont_back_this_up'], # these are for other shares # }; # $Conf{BackupFilesExclude} = undef; # # PCs that are always or often on the network can be backed up after # hours, to reduce PC, network and server load during working hours. For # each PC a count of consecutive good pings is maintained. Once a PC has # at least $Conf{BlackoutGoodCnt} consecutive good pings it is subject # to "blackout" and not backed up during hours and days specified by # $Conf{BlackoutPeriods}. # # To allow for periodic rebooting of a PC or other brief periods when a # PC is not on the network, a number of consecutive bad pings is allowed # before the good ping count is reset. This parameter is # $Conf{BlackoutBadPingLimit}. # # Note that bad and good pings don't occur with the same interval. If a # machine is always on the network, it will only be pinged roughly once # every $Conf{IncrPeriod} (eg: once per day). So a setting for # $Conf{BlackoutGoodCnt} of 7 means it will take around 7 days for a # machine to be subject to blackout. On the other hand, if a ping is # failed, it will be retried roughly every time BackupPC wakes up, eg, # every one or two hours. So a setting for $Conf{BlackoutBadPingLimit} of # 3 means that the PC will lose its blackout status after 3-6 hours of # unavailability. # # To disable the blackout feature set $Conf{BlackoutGoodCnt} to a negative # value. A value of 0 will make all machines subject to blackout. But # if you don't want to do any backups during the day it would be easier # to just set $Conf{WakeupSchedule} to a restricted schedule. # $Conf{BlackoutBadPingLimit} = 3; $Conf{BlackoutGoodCnt} = 7; # # One or more blackout periods can be specified. If a client is # subject to blackout then no regular (non-manual) backups will # be started during any of these periods. hourBegin and hourEnd # specify hours from midnight and weekDays is a list of days of # the week where 0 is Sunday, 1 is Monday etc. # # For example: # # $Conf{BlackoutPeriods} = [ # { # hourBegin => 7.0, # hourEnd => 19.5, # weekDays => [1, 2, 3, 4, 5], # }, # ]; # # specifies one blackout period from 7:00am to 7:30pm local time # on Mon-Fri. # # The blackout period can also span midnight by setting # hourBegin > hourEnd, eg: # # $Conf{BlackoutPeriods} = [ # { # hourBegin => 7.0, # hourEnd => 19.5, # weekDays => [1, 2, 3, 4, 5], # }, # { # hourBegin => 23, # hourEnd => 5, # weekDays => [5, 6], # }, # ]; # # This specifies one blackout period from 7:00am to 7:30pm local time # on Mon-Fri, and a second period from 11pm to 5am on Friday and # Saturday night. # $Conf{BlackoutPeriods} = [ { hourBegin => 7.0, hourEnd => 19.5, weekDays => [1, 2, 3, 4, 5], }, ]; # # A backup of a share that has zero files is considered fatal. This is # used to catch miscellaneous Xfer errors that result in no files being # backed up. If you have shares that might be empty (and therefore an # empty backup is valid) you should set this flag to 0. # $Conf{BackupZeroFilesIsFatal} = 1; ########################################################################### # How to backup a client # (can be overridden in the per-PC config.pl) ########################################################################### # # What transport method to use to backup each host. If you have # a mixed set of WinXX and linux/unix hosts you will need to override # this in the per-PC config.pl. # # The valid values are: # # - 'smb': backup and restore via smbclient and the SMB protocol. # Easiest choice for WinXX. # # - 'rsync': backup and restore via rsync (via rsh or ssh). # Best choice for linux/unix. Good choice also for WinXX. # # - 'rsyncd': backup and restore via rsync daemon on the client. # Best choice for linux/unix if you have rsyncd running on # the client. Good choice also for WinXX. # # - 'tar': backup and restore via tar, tar over ssh, rsh or nfs. # Good choice for linux/unix. # # - 'archive': host is a special archive host. Backups are not done. # An archive host is used to archive other host's backups # to permanent media, such as tape, CDR or DVD. # # $Conf{XferMethod} = 'smb'; # # Level of verbosity in Xfer log files. 0 means be quiet, 1 # will give one line per file, 2 will also show skipped files on # incrementals, higher values give more output. # $Conf{XferLogLevel} = 1; # # Filename charset encoding on the client. BackupPC uses utf8 # on the server for filename encoding. If this is empty, then # utf8 is assumed and client filenames will not be modified. # If set to a different encoding then filenames will converted # to/from utf8 automatically during backup and restore. # # If the filenames displayed in the browser (eg: accents or special # characters) don't look right then it is likely you haven't set # $Conf{ClientCharset} correctly. # # If you are using smbclient on a WinXX machine, smbclient will convert # to the "unix charset" setting in smb.conf. The default is utf8, # in which case leave $Conf{ClientCharset} empty since smbclient does # the right conversion. # # If you are using rsync on a WinXX machine then it does no conversion. # A typical WinXX encoding for latin1/western europe is 'cp1252', # so in this case set $Conf{ClientCharset} to 'cp1252'. # # On a linux or unix client, run "locale charmap" to see the client's # charset. Set $Conf{ClientCharset} to this value. A typical value # for english/US is 'ISO-8859-1'. # # Do "perldoc Encode::Supported" to see the list of possible charset # values. The FAQ at http://www.cl.cam.ac.uk/~mgk25/unicode.html # is excellent, and http://czyborra.com/charsets/iso8859.html # provides more information on the iso-8859 charsets. # $Conf{ClientCharset} = ''; # # Prior to 3.x no charset conversion was done by BackupPC. Backups were # stored in whatever charset the XferMethod provided - typically utf8 # for smbclient and the client's locale settings for rsync and tar (eg: # cp1252 for rsync on WinXX and perhaps iso-8859-1 with rsync on linux). # This setting tells BackupPC the charset that was used to store filenames # in old backups taken with BackupPC 2.x, so that non-ascii filenames in # old backups can be viewed and restored. # $Conf{ClientCharsetLegacy} = 'iso-8859-1'; # # Optionally map the share name to a different path on the client when the # xfer program is run. This can be used if you create a snapshot on the client, # which has a different path to the real share name. Or you could use simpler # names for the share instead of a path (eg: root, home, usr) and map them to # the real paths here. # # This should be a hash whose key is the share name used in $Conf{SmbShareName}, # $Conf{TarShareName}, $Conf{RsyncShareName}, $Conf{FtpShareName}, and the # value is the string path name on the client. When a backup or restore is # done, if there is no matching entry in $Conf{ClientShareName2Path}, or the # entry is empty, then the share name is not modified (so the default behavior # is unchanged). # # If you are using the rsyncd xfer method, then there is no need to use this # configuration setting (since rsyncd already supports mapping of share names # to paths in the client's rsyncd.conf). # $Conf{ClientShareName2Path} = {}; ########################################################################### # Samba Configuration # (can be overwritten in the per-PC log file) ########################################################################### # # Name of the host share that is backed up when using SMB. This can be a # string or an array of strings if there are multiple shares per host. # Examples: # # $Conf{SmbShareName} = 'c'; # backup 'c' share # $Conf{SmbShareName} = ['c', 'd']; # backup 'c' and 'd' shares # # This setting only matters if $Conf{XferMethod} = 'smb'. # $Conf{SmbShareName} = 'C$'; # # Smbclient share username. This is passed to smbclient's -U argument. # # This setting only matters if $Conf{XferMethod} = 'smb'. # $Conf{SmbShareUserName} = ''; # # Smbclient share password. This is passed to smbclient via its PASSWD # environment variable. There are several ways you can tell BackupPC # the smb share password. In each case you should be very careful about # security. If you put the password here, make sure that this file is # not readable by regular users! See the "Setting up config.pl" section # in the documentation for more information. # # This setting only matters if $Conf{XferMethod} = 'smb'. # $Conf{SmbSharePasswd} = ''; # # Full path for smbclient. Security caution: normal users should not # allowed to write to this file or directory. # # smbclient is from the Samba distribution. smbclient is used to # actually extract the incremental or full dump of the share filesystem # from the PC. # # This setting only matters if $Conf{XferMethod} = 'smb'. # $Conf{SmbClientPath} = ''; # # Command to run smbclient for a full dump. # This setting only matters if $Conf{XferMethod} = 'smb'. # # The following variables are substituted at run-time: # # $smbClientPath same as $Conf{SmbClientPath} # $host host to backup/restore # $hostIP host IP address # $shareName share name # $userName username # $fileList list of files to backup (based on exclude/include) # $I_option optional -I option to smbclient # $X_option exclude option (if $fileList is an exclude list) # $timeStampFile start time for incremental dump # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{SmbClientFullCmd} = '$smbClientPath \\\\$host\\$shareName' . ' $I_option -U $userName -E -d 1' . ' -c tarmode\\ full -mSMB3 -Tc$X_option - $fileList'; # # Command to run smbclient for an incremental dump. # This setting only matters if $Conf{XferMethod} = 'smb'. # # Same variable substitutions are applied as $Conf{SmbClientFullCmd}. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{SmbClientIncrCmd} = '$smbClientPath \\\\$host\\$shareName' . ' $I_option -U $userName -E -d 1' . ' -c tarmode\\ full -mSMB3 -TcN$X_option $timeStampFile - $fileList'; # # Command to run smbclient for a restore. # This setting only matters if $Conf{XferMethod} = 'smb'. # # Same variable substitutions are applied as $Conf{SmbClientFullCmd}. # # If your smb share is read-only then direct restores will fail. # You should set $Conf{SmbClientRestoreCmd} to undef and the # corresponding CGI restore option will be removed. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{SmbClientRestoreCmd} = '$smbClientPath \\\\$host\\$shareName $I_option -U $userName -E -d 1 -c tarmode\\ full -mSMB3 -Tx -'; ########################################################################### # Tar Configuration # (can be overwritten in the per-PC log file) ########################################################################### # # Which host directories to backup when using tar transport. This can be a # string or an array of strings if there are multiple directories to # backup per host. Examples: # # $Conf{TarShareName} = '/'; # backup everything # $Conf{TarShareName} = '/home'; # only backup /home # $Conf{TarShareName} = ['/home', '/src']; # backup /home and /src # # The fact this parameter is called 'TarShareName' is for historical # consistency with the Smb transport options. You can use any valid # directory on the client: there is no need for it to correspond to # any Smb share or device mount point. # # Note also that you can also use $Conf{BackupFilesOnly} to specify # a specific list of directories to backup. It's more efficient to # use this option instead of $Conf{TarShareName} since a new tar is # run for each entry in $Conf{TarShareName}. # # On the other hand, if you add --one-file-system to $Conf{TarClientCmd} # you can backup each file system separately, which makes restoring one # bad file system easier. In this case you would list all of the mount # points here, since you can't get the same result with # $Conf{BackupFilesOnly}: # # $Conf{TarShareName} = ['/', '/var', '/data', '/boot']; # # This setting only matters if $Conf{XferMethod} = 'tar'. # $Conf{TarShareName} = '/'; # # Command to run tar on the client. GNU tar is required. You will # need to fill in the correct paths for ssh2 on the local host (server) # and GNU tar on the client. Security caution: normal users should not # allowed to write to these executable files or directories. # # $Conf{TarClientCmd} is appended with with either $Conf{TarFullArgs} or # $Conf{TarIncrArgs} to create the final command that is run. # # See the documentation for more information about setting up ssh2 keys. # # If you plan to use NFS then tar just runs locally and ssh2 is not needed. # For example, assuming the client filesystem is mounted below /mnt/hostName, # you could use something like: # # $Conf{TarClientCmd} = '$tarPath -c -v -f - -C /mnt/$host/$shareName' # . ' --totals'; # # In the case of NFS or rsh you need to make sure BackupPC's privileges # are sufficient to read all the files you want to backup. Also, you # will probably want to add "/proc" to $Conf{BackupFilesExclude}. # # The following variables are substituted at run-time: # # $host hostname # $hostIP host's IP address # $incrDate newer-than date for incremental backups # $shareName share name to backup (ie: top-level directory path) # $fileList specific files to backup or exclude # $tarPath same as $Conf{TarClientPath} # $sshPath same as $Conf{SshPath} # # If a variable is followed by a "+" it is shell escaped. This is # necessary for the command part of ssh or rsh, since it ends up # getting passed through the shell. # # This setting only matters if $Conf{XferMethod} = 'tar'. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{TarClientCmd} = '$sshPath -q -x -n -l root $host env LC_ALL=C $tarPath -c -v -f - -C $shareName+ --totals'; # # Extra tar arguments for full backups. Several variables are substituted at # run-time. See $Conf{TarClientCmd} for the list of variable substitutions. # # If you are running tar locally (ie: without rsh or ssh) then remove the # "+" so that the argument is no longer shell escaped. # # This setting only matters if $Conf{XferMethod} = 'tar'. # $Conf{TarFullArgs} = '$fileList+'; # # Extra tar arguments for incr backups. Several variables are substituted at # run-time. See $Conf{TarClientCmd} for the list of variable substitutions. # # Note that GNU tar has several methods for specifying incremental backups, # including: # # --newer-mtime $incrDate+ # This causes a file to be included if the modification time is # later than $incrDate (meaning its contents might have changed). # But changes in the ownership or modes will not qualify the # file to be included in an incremental. # # --newer=$incrDate+ # This causes the file to be included if any attribute of the # file is later than $incrDate, meaning either attributes or # the modification time. This is the default method. Do # not use --atime-preserve in $Conf{TarClientCmd} above, # otherwise resetting the atime (access time) counts as an # attribute change, meaning the file will always be included # in each new incremental dump. # # If you are running tar locally (ie: without rsh or ssh) then remove the # "+" so that the argument is no longer shell escaped. # # This setting only matters if $Conf{XferMethod} = 'tar'. # $Conf{TarIncrArgs} = '--newer=$incrDate+ $fileList+'; # # Full command to run tar for restore on the client. GNU tar is required. # This can be the same as $Conf{TarClientCmd}, with tar's -c replaced by -x # and ssh's -n removed. # # See $Conf{TarClientCmd} for full details. # # This setting only matters if $Conf{XferMethod} = "tar". # # If you want to disable direct restores using tar, you should set # $Conf{TarClientRestoreCmd} to undef and the corresponding CGI # restore option will be removed. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{TarClientRestoreCmd} = '$sshPath -q -x -l root $host' . ' env LC_ALL=C $tarPath -x -p --numeric-owner --same-owner' . ' -v -f - -C $shareName+'; # # Full path for tar on the client. Security caution: normal users should not # allowed to write to this file or directory. # # This setting only matters if $Conf{XferMethod} = 'tar'. # $Conf{TarClientPath} = ''; ########################################################################### # Rsync/Rsyncd Configuration # (can be overwritten in the per-PC log file) ########################################################################### # # Path to rsync executable on the client. If it is set, it is passed to # to rsync_bpc using the --rsync-path option. You can also add sudo, # for example: # # $Conf{RsyncClientPath} = 'sudo /usr/bin/rsync'; # # For OSX laptop clients, you can use caffeinate to make sure the laptop # stays awake during the backup, eg: # # $Conf{RsyncClientPath} = '/usr/bin/sudo /usr/bin/caffeinate -ism /usr/bin/rsync'; # # This setting only matters if $Conf{XferMethod} = 'rsync'. # $Conf{RsyncClientPath} = ''; # # Full path to rsync_bpc on the server. Rsync_bpc is the customized # version of rsync that is used on the server for rsync and rsyncd # transfers. # $Conf{RsyncBackupPCPath} = ""; # # Ssh arguments for rsync to run ssh to connect to the client. # Rather than permit root ssh on the client, it is more secure # to just allow ssh via a low-privileged user, and use sudo # in $Conf{RsyncClientPath}. # # The setting should only have two entries: "-e" and # everything else; don't add additional array elements. # # This setting only matters if $Conf{XferMethod} = 'rsync'. # $Conf{RsyncSshArgs} = ['-e', '$sshPath -l root']; # # Share name to backup. For $Conf{XferMethod} = "rsync" this should # be a file system path, eg '/' or '/home'. # # For $Conf{XferMethod} = "rsyncd" this should be the name of the module # to backup (ie: the name from /etc/rsynd.conf). # # This can also be a list of multiple file system paths or modules. # For example, by adding --one-file-system to $Conf{RsyncArgs} you # can backup each file system separately, which makes restoring one # bad file system easier. In this case you would list all of the mount # points: # # $Conf{RsyncShareName} = ['/', '/var', '/data', '/boot']; # $Conf{RsyncShareName} = '/'; # # Rsync daemon port on the client, for $Conf{XferMethod} = "rsyncd". # $Conf{RsyncdClientPort} = 873; # # Rsync daemon username on client, for $Conf{XferMethod} = "rsyncd". # The username and password are stored on the client in whatever file # the "secrets file" parameter in rsyncd.conf points to # (eg: /etc/rsyncd.secrets). # $Conf{RsyncdUserName} = ''; # # Rsync daemon username on client, for $Conf{XferMethod} = "rsyncd". # The username and password are stored on the client in whatever file # the "secrets file" parameter in rsyncd.conf points to # (eg: /etc/rsyncd.secrets). # $Conf{RsyncdPasswd} = ''; # # Arguments to rsync for backup. Do not edit the first set unless you # have a good understanding of rsync options. # $Conf{RsyncArgs} = [ '--super', '--recursive', '--protect-args', '--numeric-ids', '--perms', '--owner', '--group', '-D', '--times', '--links', '--hard-links', '--delete', '--delete-excluded', '--one-file-system', '--partial', '--log-format=log: %o %i %B %8U,%8G %9l %f%L', '--stats', # # Add additional arguments here, for example --acls or --xattrs # if all the clients support them. # #'--acls', #'--xattrs', ]; # # Additional arguments added to RsyncArgs. This can be used in # combination with $Conf{RsyncArgs} to allow customization of # the rsync arguments on a part-client basis. The standard # arguments go in $Conf{RsyncArgs} and $Conf{RsyncArgsExtra} # can be set on a per-client basis. # # Examples of additional arguments that should work are --exclude/--include, # eg: # # $Conf{RsyncArgsExtra} = [ # '--exclude', '/proc', # '--exclude', '*.tmp', # '--acls', # '--xattrs', # ]; # # Both $Conf{RsyncArgs} and $Conf{RsyncArgsExtra} are subject # to the following variable substitutions: # # $client client name being backed up # $host hostname (could be different from client name if # $Conf{ClientNameAlias} is set) # $hostIP IP address of host # $confDir configuration directory path # $shareName share name being backed up # # This allows settings of the form: # # $Conf{RsyncArgsExtra} = [ # '--exclude-from=$confDir/pc/$host.exclude', # ]; # $Conf{RsyncArgsExtra} = []; # # Additional arguments for a full rsync or rsyncd backup. # # The --checksum argument causes the client to send full-file checksum # for every file (meaning the client reads every file and computes the # checksum, which is sent with the file list). On the server, rsync_bpc # will skip any files that have a matching full-file checksum, and size, # mtime and number of hardlinks. Any file that has different attributes # will be updating using the block rsync algorithm. # # In V3, full backups applied the block rsync algorithm to every file, # which is a lot slower but a bit more conservative. To get that # behavior, replace --checksum with --ignore-times. # $Conf{RsyncFullArgsExtra} = ['--checksum']; # # Additional arguments for an incremental rsync or rsyncd backup. # $Conf{RsyncIncrArgsExtra} = []; # # Arguments to rsync for restore. Do not edit the first set unless you # have a thorough understanding of how File::RsyncP works. # # If you want to disable direct restores using rsync (eg: is the module # is read-only), you should set $Conf{RsyncRestoreArgs} to undef and # the corresponding CGI restore option will be removed. # # $Conf{RsyncRestoreArgs} is subject to the following variable # substitutions: # # $client client name being backed up # $host hostname (could be different from client name if # $Conf{ClientNameAlias} is set) # $hostIP IP address of host # $confDir configuration directory path # # Note: $Conf{RsyncArgsExtra} doesn't apply to $Conf{RsyncRestoreArgs}. # $Conf{RsyncRestoreArgs} = [ '--recursive', '--super', '--protect-args', '--numeric-ids', '--perms', '--owner', '--group', '-D', '--times', '--links', '--hard-links', '--delete', '--partial', '--log-format=log: %o %i %B %8U,%8G %9l %f%L', '--stats', # # Add additional arguments here # #'--acls', #'--xattrs', ]; # # Additional arguments for an rsync or rsyncd restore. # # This makes it easy to have per-client arguments. # $Conf{RsyncRestoreArgsExtra} = []; ########################################################################### # FTP Configuration # (can be overwritten in the per-PC log file) ########################################################################## # # Which host directories to backup when using FTP. This can be a # string or an array of strings if there are multiple shares per host. # # This value must be specified in one of two ways: either as a # subdirectory of the 'share root' on the server, or as the absolute # path of the directory. # # In the following example, if the directory /home/username is the # root share of the ftp server with the given username, the following # two values will back up the same directory: # # $Conf{FtpShareName} = 'www'; # www directory # $Conf{FtpShareName} = '/home/username/www'; # same directory # # Path resolution is not supported; i.e.; you may not have an ftp # share path defined as '../otheruser' or '~/games'. # # Multiple shares may also be specified, as with other protocols: # # $Conf{FtpShareName} = [ 'www', # 'bin', # 'config' ]; # # Note also that you can also use $Conf{BackupFilesOnly} to specify # a specific list of directories to backup. It's more efficient to # use this option instead of $Conf{FtpShareName} since a new tar is # run for each entry in $Conf{FtpShareName}. # # This setting only matters if $Conf{XferMethod} = 'ftp'. # $Conf{FtpShareName} = ''; # # FTP username. This is used to log into the server. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpUserName} = ''; # # FTP user password. This is used to log into the server. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpPasswd} = ''; # # Whether passive mode is used. The correct setting depends upon # whether local or remote ports are accessible from the other machine, # which is affected by any firewall or routers between the FTP server # on the client and the BackupPC server. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpPassive} = 1; # # Transfer block size. This sets the size of the amounts of data in # each frame. While undefined, this value takes the default value. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpBlockSize} = 10240; # # The port of the ftp server. If undefined, 21 is used. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpPort} = 21; # # Connection timeout for FTP. When undefined, the default is 120 seconds. # # This setting is used only if $Conf{XferMethod} = 'ftp'. # $Conf{FtpTimeout} = 120; # # Behaviour when BackupPC encounters symlinks on the FTP share. # # Symlinks cannot be restored via FTP, so the desired behaviour will # be different depending on the setup of the share. The default for # this behavior is 1. Directory shares with more complicated directory # structures should consider other protocols. # $Conf{FtpFollowSymlinks} = 0; ########################################################################### # Archive Configuration # (can be overwritten in the per-PC log file) ########################################################################### # # Archive Destination # # The Destination of the archive # e.g. /tmp for file archive or /dev/nst0 for device archive # $Conf{ArchiveDest} = '/tmp'; # # Archive Compression type # # The valid values are: # # - 'none': No Compression # # - 'gzip': Medium Compression. Recommended. # # - 'bzip2': High Compression but takes longer. # $Conf{ArchiveComp} = 'gzip'; # # Archive Parity Files # # The amount of Parity data to generate, as a percentage # of the archive size. # Uses the command line par2 (par2cmdline) available from # http://parchive.sourceforge.net # # Only useful for file dumps. # # Set to 0 to disable this feature. # $Conf{ArchivePar} = 0; # # Archive Size Split # # Only for file archives. Splits the output into # the specified size * 1,000,000. # e.g. to split into 650,000,000 bytes, specify 650 below. # # If the value is 0, or if $Conf{ArchiveDest} is an existing file or # device (e.g. a streaming tape drive), this feature is disabled. # $Conf{ArchiveSplit} = 0; # # Archive Command # # This is the command that is called to actually run the archive process # for each host. The following variables are substituted at run-time: # # $Installdir The installation directory of BackupPC # $tarCreatePath The path to BackupPC_tarCreate # $splitpath The path to the split program # $parpath The path to the par2 program # $host The host to archive # $backupnumber The backup number of the host to archive # $compression The path to the compression program # $compext The extension assigned to the compression type # $splitsize The number of bytes to split archives into # $archiveloc The location to put the archive # $parfile The amount of parity data to create (percentage) # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{ArchiveClientCmd} = '$Installdir/bin/BackupPC_archiveHost' . ' $tarCreatePath $splitpath $parpath $host $backupnumber' . ' $compression $compext $splitsize $archiveloc $parfile *'; # # Full path for ssh. Security caution: normal users should not # allowed to write to this file or directory. # $Conf{SshPath} = ''; # # Full path for nmblookup. Security caution: normal users should not # allowed to write to this file or directory. # # nmblookup is from the Samba distribution. nmblookup is used to get the # netbios name, necessary for DHCP hosts. # $Conf{NmbLookupPath} = ''; # # NmbLookup command. Given an IP address, does an nmblookup on that # IP address. The following variables are substituted at run-time: # # $nmbLookupPath path to nmblookup ($Conf{NmbLookupPath}) # $host IP address # # This command is only used for DHCP hosts: given an IP address, this # command should try to find its NetBios name. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{NmbLookupCmd} = '$nmbLookupPath -A $host'; # # NmbLookup command. Given a netbios name, finds that host by doing # a NetBios lookup. Several variables are substituted at run-time: # # $nmbLookupPath path to nmblookup ($Conf{NmbLookupPath}) # $host NetBios name # # In some cases you might need to change the broadcast address, for # example if nmblookup uses 192.168.255.255 by default and you find # that doesn't work, try 192.168.1.255 (or your equivalent class C # address) using the -B option: # # $Conf{NmbLookupFindHostCmd} = '$nmbLookupPath -B 192.168.1.255 $host'; # # If you use a WINS server and your machines don't respond to # multicast NetBios requests you can use this (replace 1.2.3.4 # with the IP address of your WINS server): # # $Conf{NmbLookupFindHostCmd} = '$nmbLookupPath -R -U 1.2.3.4 $host'; # # This is preferred over multicast since it minimizes network traffic. # # Experiment manually for your site to see what form of nmblookup command # works. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{NmbLookupFindHostCmd} = '$nmbLookupPath $host'; # # For fixed IP address hosts, BackupPC_dump can also verify the netbios # name to ensure it matches the hostname. An error is generated if # they do not match. Typically this flag is off. But if you are going # to transition a bunch of machines from fixed host addresses to DHCP, # setting this flag is a great way to verify that the machines have # their netbios name set correctly before turning on DHCP. # $Conf{FixedIPNetBiosNameCheck} = 0; # # Full path to the ping command. Security caution: normal users # should not be allowed to write to this file or directory. # # If you want to disable ping checking, set this to some program # that exits with 0 status, eg: # # $Conf{PingPath} = '/bin/echo'; # $Conf{PingPath} = ''; # # Like PingPath, but for IPv6. Security caution: normal users # should not be allowed to write to this file or directory. # In some environments, this is something like '/usr/bin/ping6'. # In modern environments, the regular ping command can handle both # IPv4 and IPv6. In the latter case, just set it to $Conf{PingPath} # # If you want to disable ping checking for IPv6 hosts, set this to # some program that exits with 0 status, eg: # # $Conf{Ping6Path} = '/bin/echo'; # $Conf{Ping6Path} = ''; # # Ping command. The following variables are substituted at run-time: # # $pingPath path to ping ($Conf{PingPath} or $Conf{Ping6Path}) # depending on the address type of $host. # $host hostname # # Wade Brown reports that on solaris 2.6 and 2.7 ping -s returns the wrong # exit status (0 even on failure). Replace with "ping $host 1", which # gets the correct exit status but we don't get the round-trip time. # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{PingCmd} = '$pingPath -c 1 $host'; # # Maximum round-trip ping time in milliseconds. This threshold is set # to avoid backing up PCs that are remotely connected through WAN or # dialup connections. The output from ping -s (assuming it is supported # on your system) is used to check the round-trip packet time. On your # local LAN round-trip times should be much less than 20msec. On most # WAN or dialup connections the round-trip time will be typically more # than 20msec. Tune if necessary. # $Conf{PingMaxMsec} = 20; # # Compression level to use on files. 0 means no compression. Compression # levels can be from 1 (least cpu time, slightly worse compression) to # 9 (most cpu time, slightly better compression). The recommended value # is 3. Changing to 5, for example, will take maybe 20% more cpu time # and will get another 2-3% additional compression. See the zlib # documentation for more information about compression levels. # # Changing compression on or off after backups have already been done # will require both compressed and uncompressed pool files to be stored. # This will increase the pool storage requirements, at least until all # the old backups expire and are deleted. # # It is ok to change the compression value (from one non-zero value to # another non-zero value) after dumps are already done. Since BackupPC # matches pool files by comparing the uncompressed versions, it will still # correctly match new incoming files against existing pool files. The # new compression level will take effect only for new files that are # newly compressed and added to the pool. # # If compression was off and you are enabling compression for the first # time you can use the BackupPC_compressPool utility to compress the # pool. This avoids having the pool grow to accommodate both compressed # and uncompressed backups. See the documentation for more information. # $Conf{CompressLevel} = 3; # # Timeout in seconds when listening for the transport program's # (smbclient, tar etc) stdout. If no output is received during this # time, then it is assumed that something has wedged during a backup, # and the backup is terminated. # # Note that stdout buffering combined with huge files being backed up # could cause longish delays in the output from smbclient that # BackupPC_dump sees, so in some cases you might want to increase # this value. # # For rsync, this is passed onto rsync_bpc using the --timeout argument, # which is based on any I/O, so you could likely reduce this value. # $Conf{ClientTimeout} = 72000; # # Maximum number of log files we keep around in each PC's directory # (ie: pc/$host). These files are aged monthly. A setting of 12 # means there will be at most the files LOG, LOG.0, LOG.1, ... LOG.11 # in the pc/$host directory (ie: about a year's worth). (Except this # month's LOG, these files will have a .z extension if compression # is on). # # If you decrease this number after BackupPC has been running for a # while you will have to manually remove the older log files. # $Conf{MaxOldPerPCLogFiles} = 12; # # Optional commands to run before and after dumps and restores, # and also before and after each share of a dump. # # Stdout from these commands will be written to the Xfer (or Restore) # log file. One example of using these commands would be to # shut down and restart a database server, dump a database # to files for backup, or doing a snapshot of a share prior # to a backup. Example: # # $Conf{DumpPreUserCmd} = '$sshPath -q -x -l root $host /usr/bin/dumpMysql'; # # The following variable substitutions are made at run time for # $Conf{DumpPreUserCmd}, $Conf{DumpPostUserCmd}, $Conf{DumpPreShareCmd} # and $Conf{DumpPostShareCmd}: # # $type type of dump (incr or full) # $xferOK 1 if the dump succeeded, 0 if it didn't # $client client name being backed up # $host hostname (could be different from client name if # $Conf{ClientNameAlias} is set) # $hostIP IP address of host # $user username from the hosts file # $moreUsers list of additional users from the hosts file # $share the first share name (or current share for # $Conf{DumpPreShareCmd} and $Conf{DumpPostShareCmd}) # $shares list of all the share names # $XferMethod value of $Conf{XferMethod} (eg: tar, rsync, smb) # $sshPath value of $Conf{SshPath}, # $cmdType set to DumpPreUserCmd or DumpPostUserCmd # # The following variable substitutions are made at run time for # $Conf{RestorePreUserCmd} and $Conf{RestorePostUserCmd}: # # $client client name being backed up # $xferOK 1 if the restore succeeded, 0 if it didn't # $host hostname (could be different from client name if # $Conf{ClientNameAlias} is set) # $hostIP IP address of host # $user username from the hosts file # $moreUsers list of additional users from the hosts file # $share the first share name # $XferMethod value of $Conf{XferMethod} (eg: tar, rsync, smb) # $sshPath value of $Conf{SshPath}, # $type set to "restore" # $bkupSrcHost hostname of the restore source # $bkupSrcShare share name of the restore source # $bkupSrcNum backup number of the restore source # $pathHdrSrc common starting path of restore source # $pathHdrDest common starting path of destination # $fileList list of files being restored # $cmdType set to RestorePreUserCmd or RestorePostUserCmd # # The following variable substitutions are made at run time for # $Conf{ArchivePreUserCmd} and $Conf{ArchivePostUserCmd}: # # $client client name being backed up # $xferOK 1 if the archive succeeded, 0 if it didn't # $host Name of the archive host # $user username from the hosts file # $share the first share name # $XferMethod value of $Conf{XferMethod} (eg: tar, rsync, smb) # $HostList list of hosts being archived # $BackupList list of backup numbers for the hosts being archived # $archiveloc location where the archive is sent to # $parfile amount of parity data being generated (percentage) # $compression compression program being used (eg: cat, gzip, bzip2) # $compext extension used for compression type (eg: raw, gz, bz2) # $splitsize size of the files that the archive creates # $sshPath value of $Conf{SshPath}, # $type set to "archive" # $cmdType set to ArchivePreUserCmd or ArchivePostUserCmd # # Note: all Cmds are executed directly without a shell, so the prog name # needs to be a full path and you can't include shell syntax like # redirection and pipes; put that in a script if you need it. # $Conf{DumpPreUserCmd} = undef; $Conf{DumpPostUserCmd} = undef; $Conf{DumpPreShareCmd} = undef; $Conf{DumpPostShareCmd} = undef; $Conf{RestorePreUserCmd} = undef; $Conf{RestorePostUserCmd} = undef; $Conf{ArchivePreUserCmd} = undef; $Conf{ArchivePostUserCmd} = undef; # # Whether the exit status of each PreUserCmd and # PostUserCmd is checked. # # If set and the Dump/Restore/Archive Pre/Post UserCmd # returns a non-zero exit status then the dump/restore/archive # is aborted. To maintain backward compatibility (where # the exit status in early versions was always ignored), # this flag defaults to 0. # # If this flag is set and the Dump/Restore/Archive PreUserCmd # fails then the matching Dump/Restore/Archive PostUserCmd is # not executed. If DumpPreShareCmd returns a non-exit status, # then DumpPostShareCmd is not executed, but the DumpPostUserCmd # is still run (since DumpPreUserCmd must have previously # succeeded). # # An example of a DumpPreUserCmd that might fail is a script # that snapshots or dumps a database which fails because # of some database error. # $Conf{UserCmdCheckStatus} = 0; # # Override the client's hostname. This allows multiple clients # to all refer to the same physical host. This should only be # set in the per-PC config file and is only used by BackupPC at # the last moment prior to checking the host is alive, and generating # the command used to backup # that machine (ie: the value of # $Conf{ClientNameAlias} is invisible everywhere else in BackupPC). # The setting can be a hostname or IP address, eg: # # $Conf{ClientNameAlias} = 'realHostName'; # $Conf{ClientNameAlias} = '192.1.1.15'; # # which will cause the relevant smb/tar/rsync backup/restore commands # to be directed to realHostName or the IP address, not the client name. # # It can also be an array, to allow checking (in order) of several # host names or IP addresses that refer to the same host. For example, # if your client has a wired and wireless connection you could set: # # $Conf{ClientNameAlias} = ['hostname-lan', 'hostname-wifi']; # # If hostname-lan is alive, it will be used for the backup/restore. # If not, the next name (hostname-wifi) is tested. # # Note: this setting doesn't work for hosts with DHCP set to 1. # $Conf{ClientNameAlias} = undef; # # A user-settable comment string that is displayed in this host's status. # The value is otherwise ignored by BackupPC. # $Conf{ClientComment} = undef; ########################################################################### # Email reminders, status and messages # (can be overridden in the per-PC config.pl) ########################################################################### # # Full path to the sendmail command. Security caution: normal users # should not allowed to write to this file or directory. # $Conf{SendmailPath} = ''; # # Minimum period between consecutive emails to a single user. # This tries to keep annoying email to users to a reasonable # level. Email checks are done nightly, so this number is effectively # rounded up (ie: 2.5 means a user will never receive email more # than once every 3 days). # $Conf{EMailNotifyMinDays} = 2.5; # # Name to use as the "from" name for email. Depending upon your mail # handler this is either a plain name (eg: "admin") or a fully-qualified # name (eg: "admin@mydomain.com"). # $Conf{EMailFromUserName} = ''; # # Destination address to an administrative user who will receive a # nightly email with warnings and errors. If there are no warnings # or errors then no email will be sent. Depending upon your mail # handler this is either a plain name (eg: "admin") or a fully-qualified # name (eg: "admin@mydomain.com"). # $Conf{EMailAdminUserName} = ''; # # Subject for admin emails. If empty, defaults to pre-4.2.2 values. # $Conf{EMailAdminSubject} = ''; # # Destination domain name for email sent to users. By default # this is empty, meaning email is sent to plain, unqualified # addresses. Otherwise, set it to the destination domain, eg: # # $Cong{EMailUserDestDomain} = '@mydomain.com'; # # With this setting user email will be set to 'user@mydomain.com'. # $Conf{EMailUserDestDomain} = ''; # # This subject and message is sent to a user if their PC has never been # backed up. # # These values are language-dependent. The default versions can be # found in the language file (eg: lib/BackupPC/Lang/en.pm). If you # need to change the message, copy it here and edit it, eg: # # $Conf{EMailNoBackupEverMesg} = <<'EOF'; # To: $user$domain # cc: # Subject: $subj # # Dear $userName, # # This is a site-specific email message. # EOF # $Conf{EMailNoBackupEverSubj} = undef; $Conf{EMailNoBackupEverMesg} = undef; # # How old the most recent backup has to be before notifying user. # When there have been no backups in this number of days the user # is sent an email. # $Conf{EMailNotifyOldBackupDays} = 7.0; # # This subject and message is sent to a user if their PC has not recently # been backed up (ie: more than $Conf{EMailNotifyOldBackupDays} days ago). # # These values are language-dependent. The default versions can be # found in the language file (eg: lib/BackupPC/Lang/en.pm). If you # need to change the message, copy it here and edit it, eg: # # $Conf{EMailNoBackupRecentMesg} = <<'EOF'; # To: $user$domain # cc: # Subject: $subj # # Dear $userName, # # This is a site-specific email message. # EOF # $Conf{EMailNoBackupRecentSubj} = undef; $Conf{EMailNoBackupRecentMesg} = undef; # # How old the most recent backup of Outlook files has to be before # notifying user. # $Conf{EMailNotifyOldOutlookDays} = 5.0; # # This subject and message is sent to a user if their Outlook files have # not recently been backed up (ie: more than $Conf{EMailNotifyOldOutlookDays} # days ago). # # These values are language-dependent. The default versions can be # found in the language file (eg: lib/BackupPC/Lang/en.pm). If you # need to change the message, copy it here and edit it, eg: # # $Conf{EMailOutlookBackupMesg} = <<'EOF'; # To: $user$domain # cc: # Subject: $subj # # Dear $userName, # # This is a site-specific email message. # EOF # $Conf{EMailOutlookBackupSubj} = undef; $Conf{EMailOutlookBackupMesg} = undef; # # Additional email headers. This sets to charset to # utf8. # $Conf{EMailHeaders} = < administrative users are the union of groups admin and wheel, plus # craig and celia. # # $Conf{CgiAdminUserGroup} = ''; # $Conf{CgiAdminUsers} = 'craig celia'; # --> administrative users are only craig and celia'. # $Conf{CgiAdminUserGroup} = ''; $Conf{CgiAdminUsers} = ''; # # TCP port number of the SCGI server. A negative value disables the # SCGI server. Set to any available unprivileged TCP port number, # eg: 10268. Apache needs the mod_scgi module installed, and you will # need to set the same port number in the Apache configuration. Here # are some typical settings you'll need in Apache's httpd.conf: # # LoadModule scgi_module modules/mod_scgi.so # SCGIMount /BackupPC_Admin 127.0.0.1:10268 # # AuthUserFile /etc/httpd/conf/passwd # AuthType basic # AuthName "access" # require valid-user # # # Important security warning!! The SCGIServerPort must not be # accessible by anyone untrusted. That means you can't allow # untrusted users access to the BackupPC server, and you should # block the SCGIServerPort TCP port on the BackupPC server. If you # don't understand what that means, or can't confirm you have # configured SCGI securely, then don't enable it!! # $Conf{SCGIServerPort} = -1; # # Full URL of the BackupPC_Admin CGI script, or the configured path # for SCGI. Used for links in email messages. # $Conf{CgiURL} = ''; # # Full path to the rrdtool command. If available, graphs of pool usage # will be generated. If empty, then the graphs will be skipped. # # Security caution: normal users should not allowed to write to this file # or directory. # $Conf{RrdToolPath} = ''; # # Language to use. See lib/BackupPC/Lang for the list of supported # languages, which include English (en), French (fr), Spanish (es), # German (de), Italian (it), Dutch (nl), Polish (pl), Portuguese # Brazilian (pt_br) and Chinese (zh_CN). # # Currently the Language setting applies to the CGI interface and email # messages sent to users. Log files and other text are still in English. # $Conf{Language} = 'en'; # # User names that are rendered by the CGI interface can be turned # into links into their home page or other information about the # user. To set this up you need to create two sprintf() strings, # that each contain a single '%s' that will be replaced by the user # name. The default is a mailto: link. # # $Conf{CgiUserHomePageCheck} should be an absolute file path that # is used to check (via "-f") that the user has a valid home page. # Set this to undef or an empty string to turn off this check. # # $Conf{CgiUserUrlCreate} should be a full URL that points to the # user's home page. Set this to undef or an empty string to turn # off generation of URLs for usernames. # # Example: # $Conf{CgiUserHomePageCheck} = '/var/www/html/users/%s.html'; # $Conf{CgiUserUrlCreate} = 'http://myhost/users/%s.html'; # --> if /var/www/html/users/craig.html exists, then 'craig' will # be rendered as a link to http://myhost/users/craig.html. # $Conf{CgiUserHomePageCheck} = ''; $Conf{CgiUserUrlCreate} = 'mailto:%s'; # # Date display format for CGI interface. A value of 1 uses US-style # dates (MM/DD), a value of 2 uses full YYYY-MM-DD format, and zero # for international dates (DD/MM). # $Conf{CgiDateFormatMMDD} = 2; # # If set, the complete list of hosts appears in the left navigation # bar pull-down for administrators. Otherwise, just the hosts for which # the user is listed in the host file (as either the user or in moreUsers) # are displayed. # $Conf{CgiNavBarAdminAllHosts} = 1; # # Enable/disable the search box in the navigation bar. # $Conf{CgiSearchBoxEnable} = 1; # # Additional navigation bar links. These appear for both regular users # and administrators. This is a list of hashes giving the link (URL) # and the text (name) for the link. Specifying lname instead of name # uses the language specific string (ie: $Lang->{lname}) instead of # just literally displaying name. # $Conf{CgiNavBarLinks} = [ { link => "?action=view&type=docs", lname => "Documentation", # actually displays $Lang->{Documentation} }, { link => "https://github.com/backuppc/backuppc/wiki", name => "Wiki", # displays literal "Wiki" }, { link => "https://backuppc.github.io/backuppc", name => "Homepage", # displays literal "Homepage" }, ]; # # Highlight colors based on status that are used in the PC summary page. # $Conf{CgiStatusHilightColor} = { Reason_backup_failed => '#ffcccc', Reason_backup_done => '#ccffcc', Reason_no_ping => '#ffff99', Reason_backup_canceled_by_user => '#ff9900', Status_backup_in_progress => '#66cc99', Disabled_OnlyManualBackups => '#d1d1d1', Disabled_AllBackupsDisabled => '#d1d1d1', }; # # Additional CGI header text. # $Conf{CgiHeaders} = ''; # # Directory where images are stored. This directory should be below # Apache's DocumentRoot. This value isn't used by BackupPC but is # used by configure.pl when you upgrade BackupPC. # # Example: # $Conf{CgiImageDir} = '/var/www/htdocs/BackupPC'; # $Conf{CgiImageDir} = ''; # # Additional mappings of filename extensions to Content-Type for # individual file restore. See $Ext2ContentType in BackupPC_Admin # for the default setting. You can add additional settings here, # or override any default settings. Example: # # $Conf{CgiExt2ContentType} = { # 'pl' => 'text/plain', # }; # $Conf{CgiExt2ContentType} = {}; # # URL (without the leading http://host) for BackupPC's image directory. # The CGI script uses this value to serve up image files. # # Example: # $Conf{CgiImageDirURL} = '/BackupPC'; # $Conf{CgiImageDirURL} = ''; # # CSS stylesheet "skin" for the CGI interface. It is stored # in the $Conf{CgiImageDir} directory and accessed via the # $Conf{CgiImageDirURL} URL. # # For BackupPC v3 and v2 the prior css versions are available # as BackupPC_retro_v3.css and BackupPC_retro_v2.css # $Conf{CgiCSSFile} = 'BackupPC_stnd.css'; # # Whether the user is allowed to delete backups. If set to a positive # value, the user will have a delete button for each backup on any # host they have permission to access. If set to 0, only # administrators have access to the backup delete feature. # If set to a negative value, even admins will not be able # to use the delete feature. # $Conf{CgiUserDeleteBackupEnable} = 0; # # Whether the user is allowed to edit their per-PC config. # $Conf{CgiUserConfigEditEnable} = 1; # # Which per-host config variables a non-admin user is allowed # to edit. Admin users can edit all per-host config variables, # even if disabled in this list. # # SECURITY WARNING: Do not let users edit any of the Cmd # config variables! That's because a user could set a # Cmd to a shell script of their choice and it will be # run as the BackupPC user. That script could do all # sorts of bad things. # $Conf{CgiUserConfigEdit} = { ArchiveClientCmd => 0, ArchiveComp => 1, ArchiveDest => 1, ArchiveInfoKeepCnt => 1, ArchivePar => 1, ArchivePostUserCmd => 0, ArchivePreUserCmd => 0, ArchiveSplit => 1, BackupFilesExclude => 1, BackupFilesOnly => 1, BackupsDisable => 1, BackupZeroFilesIsFatal => 1, BlackoutBadPingLimit => 1, BlackoutGoodCnt => 1, BlackoutPeriods => 1, ClientCharset => 1, ClientCharsetLegacy => 1, ClientComment => 1, ClientNameAlias => 1, ClientShareName2Path => 1, ClientTimeout => 1, CompressLevel => 1, DumpPostShareCmd => 0, DumpPostUserCmd => 0, DumpPreShareCmd => 0, DumpPreUserCmd => 0, EMailAdminSubject => 0, EMailAdminUserName => 0, EMailFromUserName => 1, EMailHeaders => 1, EMailNoBackupEverMesg => 1, EMailNoBackupEverSubj => 1, EMailNoBackupRecentMesg => 1, EMailNoBackupRecentSubj => 1, EMailNotifyMinDays => 1, EMailNotifyOldBackupDays => 1, EMailNotifyOldOutlookDays => 1, EMailOutlookBackupMesg => 1, EMailOutlookBackupSubj => 1, EMailUserDestDomain => 1, FillCycle => 1, FixedIPNetBiosNameCheck => 1, FtpBlockSize => 1, FtpFollowSymlinks => 1, FtpPasswd => 1, FtpPort => 1, FtpRestoreEnabled => 1, FtpShareName => 1, FtpTimeout => 1, FtpUserName => 1, FullAgeMax => 1, FullKeepCnt => 1, FullKeepCntMin => 1, FullPeriod => 1, IncrAgeMax => 1, IncrKeepCnt => 1, IncrKeepCntMin => 1, IncrPeriod => 1, MaxOldPerPCLogFiles => 1, NmbLookupCmd => 0, NmbLookupFindHostCmd => 0, PingCmd => 0, PingMaxMsec => 1, RefCntFsck => 1, RestoreInfoKeepCnt => 1, RestorePostUserCmd => 0, RestorePreUserCmd => 0, RsyncArgs => 1, RsyncArgsExtra => 1, RsyncBackupPCPath => 0, RsyncClientPath => 0, RsyncdClientPort => 1, RsyncdPasswd => 1, RsyncdUserName => 1, RsyncFullArgsExtra => 1, RsyncIncrArgsExtra => 1, RsyncRestoreArgs => 1, RsyncRestoreArgsExtra => 1, RsyncShareName => 1, RsyncSshArgs => 1, SmbClientFullCmd => 0, SmbClientIncrCmd => 0, SmbClientPath => 0, SmbClientRestoreCmd => 0, SmbShareName => 1, SmbSharePasswd => 1, SmbShareUserName => 1, TarClientCmd => 0, TarClientPath => 0, TarClientRestoreCmd => 0, TarFullArgs => 1, TarIncrArgs => 1, TarShareName => 1, UserCmdCheckStatus => 0, XferLogLevel => 1, XferMethod => 1, }; BackupPC-4.4.0/conf/BackupPC_stnd.css0000444000047500004750000001526713673511776016261 0ustar craigcraig/* * BackupPC modern CSS definitions * * Version 4.4.0, released 20 Jun 2020. * * See http: //backuppc.sourceforge.net. * * AUTHOR * Craig Barratt * Ernesto Carrea * * COPYRIGHT * Copyright (C) 2004-2020 Craig Barratt */ body { font-family: 'Open Sans',Trebuchet MS,Trebuchet,arial,sans-serif,helvetica; font-size: 11pt; background-color: white; margin: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; cursor: default; } #logo-container a img { max-width: 90%; } button, input[type="button"], input[type="submit"] { font-family: 'Open Sans',Trebuchet MS,Trebuchet,arial,sans-serif,helvetica; border: 1px solid #dfdfdf; border-radius: 2px; font-size: 12pt; padding: 6px 12px; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; outline: 0; background-color: #E0E0D7; } button:hover, input[type="button"]:hover, input[type="submit"]:hover { background-color: white; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; cursor: pointer; } input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="number"], input[type="radio"], select, textarea { background-color: white; font-family: 'Open Sans',Trebuchet MS,Trebuchet,arial,sans-serif,helvetica; border: 1px solid #dfdfdf; border-radius: 2px; font-size: 11pt; padding: 6px; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; outline: 0; display: inline-block; text-align: left; width: 90%; } input:focus, select:focus, textarea:focus { outline: none !important; border-color: #719ECE; box-shadow: 0 0 5px #719ECE; } input.inputCompact, select.inputCompact { width: auto; } textarea { min-height: 64px; } h1, .h1 { font-size: 20pt; font-weight: 400; } h2, .h2 { font-size: 14pt; font-weight: 400; } a { color: #0069ff; text-decoration: none; } a:hover { color: #0088ce; } dt { color: #3333ff } pre { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ font-size: 10pt; } table { width: 100%; max-width: 1300px; border-collapse: collapse; font-size: 11pt; border: none; } table td { border: none; padding: 4px; } .tableStnd, #host_summary_backups, #host_summary_nobackups { width: 100%; max-width: 1300px; border-collapse: collapse; font-size: 11pt; } .tableStnd td, #host_summary_backups td, #host_summary_nobackups td { padding: 4px; text-align: left; border: 1px solid #DBDBD0; } table th, .tableheader { font-size: 11pt; font-weight: 400; background-color: #f8f8f4; } table.sortable a.sortheader { background-color: #f8f8f4; font-weight: 400; text-decoration: none; display: block; } table tr td.border { padding: 2px; } table tr td.border input[type="button"] { padding: 2px 4px; } .editError { color: #ff0000; font-weight: bold; } .editComment { font-size: 10pt; } .editTextInput { font-family: courier; font-size: 10pt; } .fviewheader { font-weight: 400; font-size: 11pt; background-color: #f8f8f4; border-collapse: collapse; border: 1px solid #DBDBD0; } .fviewborder { border-collapse: collapse; border: 1px solid #DBDBD0; font-size: 10pt; } .fviewon, .fview, .fviewoff, .fviewbold { padding: 0; } .fviewoff a, .fviewon a { font-size: 10pt; text-decoration: none; line-height: 15px; color: #0069ff; } .fviewon { background-color: #f0f0e8; } .fviewoff { } .fview { } .fviewbold { font-size: 10pt; text-decoration: none; line-height: 15px; font-weight: 700; } .histView { border-bottom: 1px solid #000000; border-left: 1px solid #000000; background-color: #eeeeee; font-size: 10pt; } .histViewMis { border-bottom: 1px solid #000000; border-left: 1px solid #000000; background-color: #ffdddd; } #BpcLogo { padding: 16px 8px 8px 24px; } #navigation-container { position: fixed; width: 240px; background-color: #f8f8f6; padding-left: 10px; } .NavMenu { disabled-border-bottom: 1px solid silver; disabled-margin-bottom: 4px; } .NavMenu a { display: block; font-size: 11pt; padding: 6px 0px 6px 12px; text-decoration: none; color: #0088ce; } .NavMenu a:hover { color: #293552; background-color: #def3ff; disabled-text-decoration: underline; } .NavMenu a.NavCurrent { font-weight: 600; color: white; background-color: #0088ce; } .NavMenu .NavTitle { font-size: 14pt; font-family: 'Open Sans',Trebuchet MS,Trebuchet,arial,sans-serif,helvetica; font-weight: 400; padding: 4px 0px; margin-bottom: 2px; } .NavMenu select { width: 90%; } .BpcTableTabs { width: 100%; text-align: center; border-bottom: 1px solid #E0E0D7; } .BpcTableTabsTab, .editTabSel, .editTabNoSel { border-top-left-radius: 4px; border-top-right-radius: 4px; padding: 6px 12px; min-height: 32px; } .BpcTableTabsTab:hover, .editTabNoSel:hover { background-color: #def3ff; cursor: pointer; } .BpcTableTabsTab a, .editTabNoSel a { display: block; min-height: 24px; } .BpcTableTabsTab a:hover, .editTabNoSel a:hover { color: #676767; } .BpcTableTabsTabActive, .editTabSel { padding: 6px 12px; font-weight: 400; border-top-left-radius: 4px; border-top-right-radius: 4px; background-color: #0088ce; } .BpcTableTabsTabActive:hover, .editTabSel:hover { background-color: #0088ce; } .BpcTableTabsTabActive a, .editTabSel a { color: white; display: block; min-height: 24px; } .BpcTableTabsTabActive a:hover, .editTabSel a:hover { color: white; } .BpcTableForm { } .BpcTableFormRow {} .BpcTableFormRowHeader, .editHeader { font-family: 'Open Sans',Trebuchet MS,Trebuchet,arial,sans-serif,helvetica; font-size: 12pt; font-weight: 400; border-bottom: 1px dotted #E0E0D7; padding-top: 16px; } .editSubTable { border: 1px solid #dfdfdf; } .BpcTableFormRowError {} #BpcHostSearch input[type="text"], .NavMenu input[type="text"] { width: 140px; margin-bottom: 4px; } #BpcHostSearch input[type="submit"], .NavMenu input[type="submit"] { padding: 4px; } .NavMenu form { margin: 0; padding: 0; } .NavMenu select { padding: 4px; margin-bottom: 4px; } #Content, BpcContentWrapper { margin-left: 260px; } BackupPC-4.4.0/httpd/0000755000047500004750000000000013673511776013254 5ustar craigcraigBackupPC-4.4.0/httpd/src/0000755000047500004750000000000013673511776014043 5ustar craigcraigBackupPC-4.4.0/httpd/src/BackupPC.conf0000444000047500004750000000252213673511776016341 0ustar craigcraig# # DESCRIPTION # # This file controls access and configuration for the BackupPC CGI # interface. # # Distributed with BackupPC version 3.1.1, released 22 Dec 2008. # # This section tells Apache which machines can access the GUI. # # Depending on which version of Apache you are using, you can: # (Apache 2.2) change the "Allow from" line to allow access from # your local network; # (Apache 2.4) change the "Require local" line to "Require ip ..." # to allow access from more places, see also # https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html # # In both cases it is recommended to NOT remove "Require valid-user" # as removing it would make Apache no longer ask for credentials. # # Apache 2.2 Order deny,allow Deny from all Allow from 127.0.0.1 Require valid-user # Apache 2.4+ Require local Require valid-user # # You can change the authorization method to LDAP or another method # besides htaccess here if you are so inclined. # AuthType Basic AuthUserFile __CONFDIR__/BackupPC.users AuthName "BackupPC Community Edition Administrative Interface" Alias __IMAGEDIRURL__ __IMAGEDIR__ ScriptAlias /BackupPC_Admin __CGIDIR__/BackupPC_Admin BackupPC-4.4.0/lib/0000755000047500004750000000000013673511776012677 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/0000755000047500004750000000000013673511776014327 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/Xfer/0000755000047500004750000000000013673511776015233 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/Xfer/Protocol.pm0000444000047500004750000002411013673511776017366 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Protocol package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Protocol class which # defines standard methods for the transfer protocols in BackupPC. # # AUTHOR # Paul Mantz # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Protocol; use strict; use Data::Dumper; use Encode qw/from_to encode/; # # usage: # $t = BackupPC::Xfer::Protocol->new($args); # # new() is the constructor. There's nothing special going on here. # sub new { my($class, $bpc, $args) = @_; $args ||= {}; my $t = bless { bpc => $bpc, conf => $bpc->{Conf}, host => "", hostIP => "", shareName => "", pipeRH => undef, pipeWH => undef, badFiles => [], logLevel => $bpc->{Conf}{XferLogLevel}, # # Various stats # byteCnt => 0, fileCnt => 0, xferErrCnt => 0, xferBadShareCnt => 0, xferBadFileCnt => 0, xferOK => 0, # # User's args # %$args, }, $class; return $t; } # # usage: # $t->args($args); # # args() can be used to send additional argument to the Xfer object # via a hash reference. # sub args { my($t, $args) = @_; foreach my $arg ( keys(%$args) ) { $t->{$arg} = $args->{$arg}; } } # # usage: # $t->start(); # # start() executes the actual data transfer. Must be implemented by # the derived class. # sub start { my($t) = @_; $t->{_errStr} = "start() not implemented by " . ref($t); return; } # # # sub run { my($t) = @_; $t->{_errStr} = "run() not implemented by " . ref($t); return; } # # usage: # $t->readOutput(); # # This function is only used when $t->useTar() == 1. # sub readOutput { my($t) = @_; $t->{_errStr} = "readOutput() not implemented by " . ref($t); return; } # # usage: # $t->abort($reason); # # Aborts the current job. # sub abort { my($t, $reason) = @_; my @xferPid = $t->xferPid; $t->{abort} = 1; $t->{abortReason} = $reason; if ( @xferPid ) { kill($t->{bpc}->sigName2num("INT"), @xferPid); } } # # usage: # $t->subSelectMask # # This function sets a mask for files when ($t->useTar == 1). # sub setSelectMask { my($t) = @_; $t->{_errStr} = "readOutput() not implemented by " . ref($t); } # # usage: # $t->errStr(); # sub errStr { my($t) = @_; return $t->{_errStr}; } # # usage: # $pid = $t->xferPid(); # # xferPid() returns the process id of the child forked process. # sub xferPid { my($t) = @_; return ($t->{xferPid}); } # # usage: # $t->logMsg($msg); # sub logMsg { my($t, $msg) = @_; push(@{$t->{_logMsg}}, $msg); } # # usage: # $t->logMsgGet(); # sub logMsgGet { my($t) = @_; return shift(@{$t->{_logMsg}}); } # # usage: # $t->getStats(); # # This function returns xfer statistics. It Returns a hash ref giving # various status information about the transfer. # sub getStats { my($t) = @_; return { map { $_ => $t->{$_} } qw(byteCnt fileCnt xferErrCnt xferBadShareCnt xferBadFileCnt xferOK hostAbort hostError lastOutputLine) }; } sub getBadFiles { my($t) = @_; return @{$t->{badFiles}}; } # # useTar function. In order to work correctly, the protocol in # question should overwrite the function if it needs to return true. # sub useTar { return 0; } ############################################################################## # Logging Functions ############################################################################## # # usage: # $t->logWrite($msg [, $level]) # # This function writes to XferLOG. # sub logWrite { my($t, $msg, $level) = @_; my $XferLOG = $t->{XferLOG}; $level = 3 if ( !defined($level) ); return ($XferLOG->write(\$msg)) if ( $level <= $t->{logLevel} ); } ############################################################################## # Share name mapping ############################################################################## # # shareName2Path() maps the share name to the actual client path using # the optional $Conf{ClientShareName2Path} setting. # sub shareName2Path { my($t, $shareName) = @_; return $shareName if ( ref($t->{conf}{ClientShareName2Path}) ne "HASH" || ($t->{conf}{ClientShareName2Path}{$shareName} eq "" && $t->{conf}{ClientShareName2Path}{"*"} eq "") ); return $t->{conf}{ClientShareName2Path}{$shareName} if ( $t->{conf}{ClientShareName2Path}{$shareName} ne "" ); return $t->{conf}{ClientShareName2Path}{"*"} if ( $t->{conf}{ClientShareName2Path}{"*"} ne "" ); return $shareName; } ############################################################################## # File Inclusion/Exclusion ############################################################################## # # loadInclExclRegexps() places the appropriate file include/exclude regexps # sub loadInclExclRegexps { my($t, $shareType) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my @BackupFilesOnly = (); my @BackupFilesExclude = (); my($shareName, $shareNameRE); $shareName = $t->{shareName}; $shareName =~ s/\/*$//; # remove trailing slashes $shareName = "/" if ( $shareName eq "" ); $t->{shareName} = $shareName; $t->{shareNameRE} = $bpc->glob2re($shareName); # # load all relevant values into @BackupFilesOnly # if ( ref($conf->{BackupFilesOnly}) eq "HASH" ) { foreach my $share ( ('*', $shareName) ) { push @BackupFilesOnly, @{$conf->{BackupFilesOnly}{$share}} if ( defined($conf->{BackupFilesOnly}{$share}) ); } } elsif ( ref($conf->{BackupFilesOnly}) eq "ARRAY" ) { push(@BackupFilesOnly, @{$conf->{BackupFilesOnly}}); } elsif ( !defined($conf->{BackupFilesOnly}) ) { # # do nothing # } else { # # not a legitimate entry for $conf->{BackupFilesOnly} # $t->{_errStr} = "Incorrect syntax in BackupFilesOnly for host $t->{Host}"; return; } # # load all relevant values into @BackupFilesExclude # if ( ref($conf->{BackupFilesExclude}) eq "HASH" ) { foreach my $share ( ('*', $shareName) ) { push( @BackupFilesExclude, map { ($_ =~ /^\//) ? ($t->{shareNameRE} . $bpc->glob2re($_)) : ('.*\/' . $bpc->glob2re($_) . '(?=\/.*)?') } @{$conf->{BackupFilesExclude}{$share}} ) if ( defined($conf->{BackupFilesExclude}{$share}) ); } } elsif ( ref($conf->{BackupFilesExclude}) eq "ARRAY" ) { push(@BackupFilesExclude, map { ($_ =~ /\//) ? ($bpc->glob2re($_)) : ('.*\/' . $bpc->glob2re($_) . '(?<=\/.*)?') } @{$conf->{BackupFilesExclude}}); } elsif ( !defined($conf->{BackupFilesOnly}) ) { # # do nothing here # } else { # # not a legitimate entry for $conf->{BackupFilesExclude} # $t->{_errStr} = "Incorrect syntax in BackupFilesExclude for host $t->{Host}"; return; } # # load the regular expressions into the xfer object # $t->{BackupFilesOnly} = (@BackupFilesOnly > 0) ? \@BackupFilesOnly : undef; $t->{BackupFilesExclude} = (@BackupFilesExclude > 0) ? \@BackupFilesExclude : undef; return 1; } sub checkIncludeExclude { my($t, $file) = @_; return ($t->checkIncludeMatch($file) && !$t->checkExcludeMatch($file)); } sub checkIncludeMatch { my($t, $file) = @_; my $shareName = $t->{shareName}; my $includes = $t->{BackupFilesOnly} || return 1; my $match = ""; foreach my $include ( @{$includes} ) { # # construct regexp elsewhere to avoid syntactical evil # $match = '^' . quotemeta($shareName . $include) . '(?=\/.*)?'; # # return true if the include folder is a parent of the file, # or the folder itself. # return 1 if ( $file =~ /$match/ ); $match = '^' . quotemeta($file) . '(?=\/.*)?'; # # return true if the file is a parent of the include folder, # or the folder itself. # return 1 if ( "$shareName$include" =~ /$match/ ); } return 0; } sub checkExcludeMatch { my($t, $file) = @_; my $shareName = $t->{shareName}; my $excludes = $t->{BackupFilesExclude} || return 0; my $match = ""; foreach my $exclude ( @{$excludes} ) { # # construct regexp elsewhere to avoid syntactical evil # $match = '^' . quotemeta($shareName . $exclude) . '(?=\/.*)?'; # # return true if the exclude folder is a parent of the file, # or the folder itself. # return 1 if ( $file =~ /$match/ ); $match = '^' . quotemeta($file) . '(?=\/.*)?'; # # return true if the file is a parent of the exclude folder, # or the folder itself. # return 1 if ( "$shareName$exclude" =~ /$match/ ); } return 0; } 1; BackupPC-4.4.0/lib/BackupPC/Xfer/Smb.pm0000444000047500004750000003424513673511776016320 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Smb package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Smb class for managing # the SMB (smbclient) transport of backup data from the client. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Smb; use strict; use Encode qw/from_to encode/; use base qw(BackupPC::Xfer::Protocol); use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK); use Errno qw(EWOULDBLOCK); sub useTar { return 1; } sub start { my($t) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my $I_option = $t->{hostIP} eq $t->{host} ? [] : ['-I', $t->{hostIP}]; my(@fileList, $X_option, $smbClientCmd, $logMsg); my $shareNamePath = $t->shareName2Path($t->{shareName}); my($timeStampFile); local(*SMB); # # First propagate the PASSWD setting # $ENV{PASSWD} = $ENV{BPC_SMB_PASSWD} if ( defined($ENV{BPC_SMB_PASSWD}) ); $ENV{PASSWD} = $conf->{SmbSharePasswd} if ( defined($conf->{SmbSharePasswd}) ); if ( !defined($ENV{PASSWD}) ) { $t->{_errStr} = "passwd not set for smbclient"; return; } if ( !defined($conf->{SmbClientPath}) || !-x $conf->{SmbClientPath} ) { $t->{_errStr} = '$Conf{SmbClientPath} is not a valid executable'; return; } if ( $t->{type} eq "restore" ) { $smbClientCmd = $conf->{SmbClientRestoreCmd}; $logMsg = "restore started for share $t->{shareName}"; } else { # # Turn $conf->{BackupFilesOnly} and $conf->{BackupFilesExclude} # into a hash of arrays of files, and $conf->{SmbShareName} # to an array # $bpc->backupFileConfFix($conf, "SmbShareName"); $t->{fileIncludeHash} = {}; if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) { foreach my $file ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) { $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, $file); $t->{fileIncludeHash}{$file} = 1; } } elsif ( defined($conf->{BackupFilesExclude}{$t->{shareName}}) ) { foreach my $file ( @{$conf->{BackupFilesExclude}{$t->{shareName}}} ) { $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, $file); } # # Allow simple wildcards in exclude list by specifying "r" option. # $X_option = "rX"; } if ( $t->{type} eq "full" ) { $smbClientCmd = $conf->{SmbClientFullCmd}; $logMsg = "full backup started for share $t->{shareName}"; } else { $timeStampFile = "$t->{outDir}/timeStamp.level0"; open(LEV0, ">", $timeStampFile) && close(LEV0); utime($t->{incrBaseTime} - 3600, $t->{incrBaseTime} - 3600, $timeStampFile); $smbClientCmd = $conf->{SmbClientIncrCmd}; $logMsg = "incr backup started back to " . $bpc->timeStamp($t->{incrBaseTime} - 3600, 0) . " (backup #$t->{incrBaseBkupNum}) for share" . " $t->{shareName}"; } } $logMsg .= " (client path $shareNamePath)" if ( $t->{shareName} ne $shareNamePath ); my $args = { smbClientPath => $conf->{SmbClientPath}, host => $t->{host}, hostIP => $t->{hostIP}, client => $t->{client}, shareNameOrig => $t->{shareName}, shareName => $shareNamePath, userName => $conf->{SmbShareUserName}, fileList => \@fileList, I_option => $I_option, X_option => $X_option, timeStampFile => $timeStampFile, }; from_to($args->{shareName}, "utf8", $conf->{ClientCharset}) if ( $conf->{ClientCharset} ne "" ); $smbClientCmd = $bpc->cmdVarSubstitute($smbClientCmd, $args); if ( !defined($t->{xferPid} = open(SMB, "-|")) ) { $t->{_errStr} = "Can't fork to run smbclient"; return; } $t->{pipeSMB} = *SMB; if ( !$t->{xferPid} ) { # # This is the smbclient child. # setpgrp 0, 0; if ( $t->{type} eq "restore" ) { # # For restores close the write end of the pipe, # clone STDIN from RH, and STDERR to STDOUT # close($t->{pipeWH}); close(STDERR); open(STDERR, ">&STDOUT"); close(STDIN); open(STDIN, "<&$t->{pipeRH}"); } else { # # For backups close the read end of the pipe, # clone STDOUT to WH, STDERR to STDOUT # close($t->{pipeRH}); close(STDERR); open(STDERR, ">&STDOUT"); open(STDOUT, ">&$t->{pipeWH}"); } # # Run smbclient. # alarm(0); $bpc->cmdExecOrEval($smbClientCmd, $args); # should not be reached, but just in case... $t->{_errStr} = "Can't exec $conf->{SmbClientPath}"; return; } my $str = $bpc->execCmd2ShellCmd(@$smbClientCmd); from_to($str, $conf->{ClientCharset}, "utf8") if ( $conf->{ClientCharset} ne "" ); $t->{XferLOG}->write(\"Running: $str\n"); alarm($conf->{ClientTimeout}); $t->{_errStr} = undef; # # make pipeSMB non-blocking; BackupPC_dump uses select() to see if there # is something to read. # if ( !fcntl($t->{pipeSMB}, F_SETFL, fcntl($t->{pipeSMB}, F_GETFL, 0) | O_NONBLOCK) ) { $t->{_errStr} = "can't set pipeSMB to non-blocking"; } return $logMsg; } sub readOutput { my($t, $FDreadRef, $rout) = @_; my $conf = $t->{conf}; if ( vec($rout, fileno($t->{pipeSMB}), 1) ) { my $mesg; $! = 0; if ( sysread($t->{pipeSMB}, $mesg, 8192) <= 0 ) { if ( $! == EWOULDBLOCK ) { $t->{XferLOG}->write(\"readOutput: no bytes read (EWOULDBLOCK); continuing\n"); } elsif ( eof($t->{pipeSMB}) ) { vec($$FDreadRef, fileno($t->{pipeSMB}), 1) = 0; my $ok = close($t->{pipeSMB}); $t->{XferLOG}->write(\"readOutput: sysread returns 0 and got EOF (exit ok = $ok, $!)\n"); $t->{xferOK} = $ok ? 1 : 0; $t->{smbOut} .= "Non-zero exit status from smbclient\n" if ( !$ok ); } } else { $t->{smbOut} .= $mesg; } } while ( $t->{smbOut} =~ /(.*?)[\n\r]+(.*)/s ) { $_ = $1; $t->{smbOut} = $2; # # ignore the log file time stamps from smbclient introduced # in version 3.0.0 - don't even write them to the log file. # if ( m{^\[\d+/\d+/\d+ +\d+:\d+:\d+.*\] +(client/cli|lib/util_unistr).*\(\d+\)} ) { $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 5 ); next; } # # refresh our inactivity alarm # alarm($conf->{ClientTimeout}) if ( !$t->{abort} ); $t->{lastOutputLine} = $_ if ( !/^$/ ); from_to($_, $conf->{ClientCharset}, "utf8") if ( $conf->{ClientCharset} ne "" ); # # This section is highly dependent on the version of smbclient. # If you upgrade Samba, make sure that these regexp are still valid. # # MAKSYM 14082016: The next regex will never match on Samba-4.3, as # smbclient doesn't produce output required; keeping it for older Sambas if ( /^\s*(-?\d+) \(\s*\d+[.,]\d kb\/s\) (.*)$/ ) { my $sambaFileSize = $1; my $pcFileName = $2; (my $fileName = $pcFileName) =~ s/\\/\//g; $sambaFileSize += 1024 * 1024 * 4096 if ( $sambaFileSize < 0 ); $fileName =~ s/^\/*//; $t->{byteCnt} += $sambaFileSize; $t->{fileCnt}++; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 2 ); } elsif ( /restore tar file (.*) of size (\d+) bytes/ ) { $t->{byteCnt} += $2; $t->{fileCnt}++; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 1 ); } elsif ( /^\s*tar: dumped (\d+) files/ ) { # MAKSYM 14082016: Updating file count to the likely number $t->{xferOK} = 1; $t->{fileCnt} = $1; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^\s*tar:\d+\s*Total bytes received: (\d+)/ ) { # MAKSYM 14082016: Updating byte count to the likely number $t->{xferOK} = 1; $t->{byteCnt} = $1; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^\s*tar: restored \d+ files/ || /^\s*tar:\d+\s*tar_process done, err = 0/ ) { $t->{xferOK} = 1; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^\s*read_socket_with_timeout: timeout read. /i ) { $t->{hostAbort} = 1; $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^code 0 listing / || /^\s*code 0 opening / || /^\s*abandoning restore/i || /^\s*Error: Looping in FIND_NEXT/i || /^\s*SUCCESS - 0/i || /^\s*Call timed out: server did not respond/i || /^\s*tree connect failed: ERRDOS - ERRnoaccess \(Access denied\.\)/ || /^\s*tree connect failed: NT_STATUS_BAD_NETWORK_NAME/ || /^\s*session setup failed: NT_STATUS_LOGON_FAILURE/ || /^\s*NT_STATUS_INSUFF_SERVER_RESOURCES listing / ) { if ( $t->{hostError} eq "" ) { $t->{XferLOG}->write(\"This backup will fail because: $_\n"); $t->{hostError} = $_; } $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^\s*NT_STATUS_ACCESS_DENIED listing (.*)/ || /^\s*ERRDOS - ERRnoaccess \(Access denied\.\) listing (.*)/ ) { $t->{xferErrCnt}++; my $badDir = $1; $badDir =~ s{\\}{/}g; $badDir =~ s{/+}{/}g; $badDir =~ s{/\*$}{}; if ( $t->{hostError} eq "" && ($badDir eq "" || $t->{fileIncludeHash}{$badDir}) ) { $t->{XferLOG}->write(\"This backup will fail because: $_\n"); $t->{hostError} ||= $_; } $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); } elsif ( /^\s*directory \\/i ) { $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 2 ); } elsif ( /^tar:\d+ Error opening remote file/i ) { $t->{xferErrCnt}++; $t->{XferLOG}->write(\"XferErr $_\n") if ( $t->{logLevel} >= 1 ); } elsif ( /smb: \\>/ || /^\s*tar:\d+/ # MAKSYM 14082016: ignoring 2 more Samba-4.3 specific lines || /^\s*WARNING:/i || /^\s*added interface/i || /^\s*tarmode is now/i || /^\s*Total bytes written/i || /^\s*Domain=/i || /^\([\d\.]* kb\/s\) \(average [\d\.]* kb\/s\)$/i || /^\s*Getting files newer than/i || /^\s*restore directory \\/i || /^\s*Output is \/dev\/null/i || /^\s*Timezone is/i || /^\s*tar_re_search set/i || /^\s*creating lame (up|low)case table/i || /^\s*rlimit_max: increasing rlimit_max/i || /^\s*OS=\[/i || /^\s*$/ ) { # ignore these messages $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 1 ); } else { $t->{xferErrCnt}++; $t->{xferBadShareCnt}++ if ( /^ERRDOS - ERRbadshare/ ); $t->{xferBadFileCnt}++ if ( /^ERRDOS - ERRbadfile/ ); if ( $t->{xferErrCnt} > 50000 ) { $t->logMsg("Too many smbtar errors ($t->{xferErrCnt})... giving up"); $t->{hostError} = "Too many smbtar errors ($t->{xferErrCnt})"; return; } if ( /^Error reading file (.*)\. Got 0 bytes/ ) { # # This happens when a Windoze application has # locked the file. This is a particular problem # with MS-Outlook. smbclient has already written # the tar header to stdout, so all it can do is to # write a dummy file with the correct size, but all # zeros. BackupPC_tarExtract stores these # zero-content files efficiently as a sparse file, # or if compression is on the file will be small # anyhow. After the dump is done we simply delete # the file (it is no use) and try to link it to same # file in any recent backup. # my $badFile = $1; $badFile =~ s{\\}{/}g; $badFile =~ s{^/}{}; push( @{$t->{badFiles}}, { share => $t->{shareName}, file => $badFile } ); } $t->{XferLOG}->write(\"XferErr $_\n") if ( $t->{logLevel} >= 1 ); } } return 1; } sub setSelectMask { my($t, $FDreadRef) = @_; vec($$FDreadRef, fileno($t->{pipeSMB}), 1) = 1; } 1; BackupPC-4.4.0/lib/BackupPC/Xfer/Rsync.pm0000444000047500004750000007360213673511776016675 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Rsync package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Rsync class for managing # the rsync-based transport of backup data from/to the client. # After generating the rsync arguments, it calls BackupPC_rsyncBackup # or BackupPC_rsyncRestore to actually do the backup or restore. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2002-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Rsync; use strict; use BackupPC::View; use Encode qw/from_to encode/; use base qw(BackupPC::Xfer::Protocol); use Errno qw(EINTR); sub new { my($class, $bpc, $args) = @_; my $t = BackupPC::Xfer::Protocol->new($bpc, $args); $t->{logSave} = []; $t->{logInfo} = {}; return bless($t, $class); } sub start { my($t) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my(@fileList, $rsyncArgs, $logMsg, $rsyncCmd); my $binDir = $t->{bpc}->BinDir(); my $shareNamePath = $t->shareName2Path($t->{shareName}); alarm(0); # # We add a slash to the share name we pass to rsync # ($t->{shareNameSlash} = "$shareNamePath/") =~ s{//+$}{/}; if ( $t->{type} eq "restore" ) { my $remoteDir = "$shareNamePath/$t->{pathHdrDest}"; $remoteDir =~ s{//+}{/}g; my $filesFd; my $srcList; my $srcDir = "/"; #from_to($remoteDir, "utf8", $conf->{ClientCharset}) # if ( $conf->{ClientCharset} ne "" ); $rsyncArgs = [@{$conf->{RsyncRestoreArgs}}]; if ( ref($conf->{RsyncRestoreArgsExtra}) eq 'ARRAY' ) { push(@$rsyncArgs, @{$conf->{RsyncRestoreArgsExtra}}); } # # Each name in the fileList starts with $t->{pathHdrSrc}. The # default $t->{pathHdrDest} also ends in $t->{pathHdrSrc}, although # the user might have changed that. So we have $t->{pathHdrSrc} # appearing twice: in the fileList and in the target directory. # We have to remove one or the other. # # Since the client rsync only tries to create the last directory # in $t->{pathHdrDest} (rather than the full path), it will fail # if the parent directory doesn't exist. So, if the last part of # $t->{pathHdrDest} matches $t->{pathHdrSrc}, we remove it. # Otherwise, we remove $t->{pathHdrSrc} from each of fileList, # and it's the user's responsibility to make sure the target # directory exists. # if ( $remoteDir =~ m{(.*)\Q$t->{pathHdrSrc}\E(/*)$} ) { $remoteDir = "$1$2"; $remoteDir = "/" if ( $remoteDir eq "" ); $t->{XferLOG}->write(\"Trimming $t->{pathHdrSrc} from remoteDir -> $remoteDir\n"); } else { for ( my $i = 0 ; $i < @{$t->{fileList}} ; $i++ ) { $t->{fileList}[$i] = substr($t->{fileList}[$i], length($t->{pathHdrSrc})); $t->{fileList}[$i] = "." if ( $t->{fileList}[$i] eq "" ); } $srcDir = $t->{pathHdrSrc} if ( $t->{pathHdrSrc} ); $t->{XferLOG}->write(\"Trimming $t->{pathHdrSrc} from filesList\n"); } $t->{filesFrom} = "$conf->{TopDir}/pc/$t->{client}/.rsyncFilesFrom$$"; if ( open($filesFd, ">", $t->{filesFrom}) ) { syswrite($filesFd, join("\n", @{$t->{fileList}})); close($filesFd); $t->{XferLOG}->write(\"Wrote source file list to $t->{filesFrom}: @{$t->{fileList}}\n"); $srcList = ["--files-from=$t->{filesFrom}", $srcDir]; } else { $t->{XferLOG}->write(\"Failed to open/create file list $t->{filesFrom}\n"); $t->{_errStr} = "Failed to open/create file list $t->{filesFrom}"; return; } if ( $t->{XferMethod} eq "rsync" ) { unshift(@$rsyncArgs, "--rsync-path=$conf->{RsyncClientPath}") if ( $conf->{RsyncClientPath} ne "" ); unshift(@$rsyncArgs, @{$conf->{RsyncSshArgs}}) if ( ref($conf->{RsyncSshArgs}) eq 'ARRAY' ); push(@$rsyncArgs, @$srcList, "$t->{hostIP}:$remoteDir"); } else { if ( length($conf->{RsyncdPasswd}) ) { my($pwFd, $ok); $t->{pwFile} = "$conf->{TopDir}/pc/$t->{client}/.rsyncdpw$$"; if ( open($pwFd, ">", $t->{pwFile}) ) { $ok = 1; $ok = 0 if ( $ok && chmod(0400, $t->{pwFile}) != 1 ); $ok = 0 if ( $ok && !binmode($pwFd) ); $ok = 0 if ( $ok && syswrite($pwFd, $conf->{RsyncdPasswd}) != length($conf->{RsyncdPasswd}) ); $ok = 0 if ( $ok && !close($pwFd) ); push(@$rsyncArgs, "--password-file=$t->{pwFile}"); } if ( !$ok ) { $t->{XferLOG}->write(\"Failed to open/create rsynd pw file $t->{pwFile} ($!)\n"); $t->{_errStr} = "Failed to open/create rsynd pw file $t->{pwFile} ($!)"; return; } } #my $shareName = $t->{shareName}; #from_to($shareName, "utf8", $conf->{ClientCharset}) # if ( $conf->{ClientCharset} ne "" ); if ( $conf->{RsyncdClientPort} != 873 ) { push(@$rsyncArgs, "--port=$conf->{RsyncdClientPort}"); } if ( $conf->{ClientCharset} ne "" && $conf->{ClientCharset} ne "utf8" ) { push(@$rsyncArgs, "--iconv=utf8,$conf->{ClientCharset}"); } push(@$rsyncArgs, @$srcList, "$conf->{RsyncdUserName}\@$t->{hostIP}::$remoteDir"); } # # Merge variables into $rsyncArgs # $rsyncArgs = $bpc->cmdVarSubstitute( $rsyncArgs, { host => $t->{host}, hostIP => $t->{hostIP}, client => $t->{client}, shareNameOrig => $t->{shareName}, shareName => $shareNamePath, confDir => $conf->{ConfDir}, sshPath => $conf->{SshPath}, } ); # # create --bpc-bkup-merge list. This is the list of backups that have to # be merged to create the correct "view" of the backup being restore. # my($srcIdx, $i, $mergeInfo); my $mergeIdxList = []; for ( $i = 0 ; $i < @{$t->{backups}} ; $i++ ) { if ( $t->{backups}[$i]{num} == $t->{bkupSrcNum} ) { $srcIdx = $i; last; } } if ( !defined($srcIdx) ) { $t->{_errStr} = "Can't find backup number $t->{bkupSrcNum} in backups file"; return; } if ( $t->{backups}[$srcIdx]{version} < 4 ) { # # For per-V4 backups, we merge forward from the prior full. # my $level = $t->{backups}[$srcIdx]{level} + 1; for ( $i = $srcIdx ; $level > 0 && $i >= 0 ; $i-- ) { next if ( $t->{backups}[$i]{level} >= $level ); $level = $t->{backups}[$i]{level}; unshift(@$mergeIdxList, $i); } } else { # # For V4+ backups, we merge backward from the following filled backup. # for ( $i = $srcIdx ; $i < @{$t->{backups}} ; $i++ ) { unshift(@$mergeIdxList, $i); last if ( !$t->{backups}[$i]{noFill} ); } } foreach my $i ( @$mergeIdxList ) { $mergeInfo .= "," if ( length($mergeInfo) ); $mergeInfo .= sprintf("%d/%d/%d", $t->{backups}[$i]{num}, $t->{backups}[$i]{compress}, int($t->{backups}[$i]{version})); } unshift( @$rsyncArgs, '--bpc-top-dir', $conf->{TopDir}, # perltidy protect '--bpc-host-name', $t->{bkupSrcHost}, '--bpc-share-name', $t->{bkupSrcShare}, '--bpc-bkup-num', $t->{backups}[$srcIdx]{num}, '--bpc-bkup-comp', $t->{backups}[$srcIdx]{compress}, '--bpc-bkup-merge', $mergeInfo, '--bpc-log-level', $conf->{XferLogLevel}, '--bpc-attrib-new', ); $logMsg = "restore started below directory $t->{shareName} to host $t->{host}"; } else { # # Turn $conf->{BackupFilesOnly} and $conf->{BackupFilesExclude} # into a hash of arrays of files, and $conf->{RsyncShareName} # to an array # $bpc->backupFileConfFix($conf, "RsyncShareName"); if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) { my(@inc, @exc, %incDone, %excDone); foreach my $file2 ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) { # # If the user wants to just include /home/craig, then # we need to do create include/exclude pairs at # each level: # --include /home --exclude /* # --include /home/craig --exclude /home/* # # It's more complex if the user wants to include multiple # deep paths. For example, if they want /home/craig and # /var/log, then we need this mouthfull: # --include /home --include /var --exclude /* # --include /home/craig --exclude /home/* # --include /var/log --exclude /var/* # # To make this easier we do all the includes first and all # of the excludes at the end (hopefully they commute). # my $file = $file2; $file =~ s{/$}{}; $file = "/$file"; $file =~ s{//+}{/}g; if ( $file eq "/" ) { # # This is a special case: if the user specifies # "/" then just include it and don't exclude "/*". # push(@inc, $file) if ( !$incDone{$file} ); next; } my $f = ""; while ( $file =~ m{^/([^/]*)(.*)} ) { my $elt = $1; $file = $2; if ( $file eq "/" ) { # # preserve a tailing slash # $file = ""; $elt = "$elt/"; } push(@exc, "$f/*") if ( !$excDone{"$f/*"} ); $excDone{"$f/*"} = 1; $f = "$f/$elt"; push(@inc, $f) if ( !$incDone{$f} ); $incDone{$f} = 1; } } foreach my $file ( @inc ) { $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, "--include=$file"); } foreach my $file ( @exc ) { $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, "--exclude=$file"); } } if ( defined($conf->{BackupFilesExclude}{$t->{shareName}}) ) { foreach my $file2 ( @{$conf->{BackupFilesExclude}{$t->{shareName}}} ) { # # just append additional exclude lists onto the end # my $file = $file2; $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, "--exclude=$file"); } } # # A full dump is implemented with $Conf{RsyncFullArgsExtra}, # which is normally --checksum. This causes the client to # generate and send a full-file checksum for each file with # the file list. That can be directly compared with the # V4 full-file digest. # # In V3 --ignore-times was used, that causes block checksum # to be generated and checked for every file. That's more # conservative, but a lot more effort. # $rsyncArgs = [@{$conf->{RsyncArgs}}]; if ( $t->{type} eq "full" ) { $logMsg = "full backup started for directory $t->{shareName}"; if ( ref($conf->{RsyncFullArgsExtra}) eq 'ARRAY' ) { push(@$rsyncArgs, @{$conf->{RsyncFullArgsExtra}}); } elsif ( ref($conf->{RsyncFullArgsExtra}) eq '' && $conf->{RsyncFullArgsExtra} ne "" ) { push(@$rsyncArgs, $conf->{RsyncFullArgsExtra}); } } else { $logMsg = "incr backup started for directory $t->{shareName}"; if ( ref($conf->{RsyncIncrArgsExtra}) eq 'ARRAY' ) { push(@$rsyncArgs, @{$conf->{RsyncIncrArgsExtra}}); } elsif ( ref($conf->{RsyncIncrArgsExtra}) eq '' && $conf->{RsyncIncrArgsExtra} ne "" ) { push(@$rsyncArgs, $conf->{RsyncIncrArgsExtra}); } } # # Add any additional rsync args # push(@$rsyncArgs, @{$conf->{RsyncArgsExtra}}) if ( ref($conf->{RsyncArgsExtra}) eq 'ARRAY' ); if ( $conf->{ClientCharset} ne "" && $conf->{ClientCharset} ne "utf8" ) { push(@$rsyncArgs, "--iconv=utf8,$conf->{ClientCharset}"); } if ( $conf->{ClientTimeout} > 0 && $conf->{ClientTimeout} =~ /^\d+$/ ) { push(@$rsyncArgs, "--timeout=$conf->{ClientTimeout}"); } if ( $t->{XferMethod} eq "rsync" ) { unshift(@$rsyncArgs, "--rsync-path=$conf->{RsyncClientPath}") if ( $conf->{RsyncClientPath} ne "" ); unshift(@$rsyncArgs, @{$conf->{RsyncSshArgs}}) if ( ref($conf->{RsyncSshArgs}) eq 'ARRAY' ); } else { if ( $conf->{RsyncdClientPort} != 873 ) { push(@$rsyncArgs, "--port=$conf->{RsyncdClientPort}"); } } # # Merge variables into $rsyncArgs # $rsyncArgs = $bpc->cmdVarSubstitute( $rsyncArgs, { host => $t->{host}, hostIP => $t->{hostIP}, client => $t->{client}, shareNameOrig => $t->{shareName}, shareName => $shareNamePath, confDir => $conf->{ConfDir}, sshPath => $conf->{SshPath}, } ); if ( $t->{XferMethod} eq "rsync" ) { my $shareNameSlash = $t->{shareNameSlash}; #from_to($shareNameSlash, "utf8", $conf->{ClientCharset}) # if ( $conf->{ClientCharset} ne "" ); push(@$rsyncArgs, @fileList) if ( @fileList ); push(@$rsyncArgs, "$t->{hostIP}:$shareNameSlash", "/"); } else { my $pwFd; $t->{pwFile} = "$conf->{TopDir}/pc/$t->{client}/.rsyncdpw$$"; if ( !length($conf->{RsyncdPasswd}) ) { $t->{XferLOG}->write(\"\$Conf{RsyncdPasswd} is empty; host's rsyncd auth will fail\n"); $t->{_errStr} = "\$Conf{RsyncdPasswd} is empty; host's rsyncd auth will fail"; return; } if ( open($pwFd, ">", $t->{pwFile}) ) { chmod(0400, $t->{pwFile}); binmode($pwFd); syswrite($pwFd, $conf->{RsyncdPasswd}); close($pwFd); push(@$rsyncArgs, "--password-file=$t->{pwFile}"); } else { $t->{XferLOG}->write(\"Failed to open/create rsynd pw file $t->{pwFile}\n"); $t->{_errStr} = "Failed to open/create rsynd pw file $t->{pwFile}"; return; } my $shareName = $shareNamePath; #from_to($shareName, "utf8", $conf->{ClientCharset}) # if ( $conf->{ClientCharset} ne "" ); push(@$rsyncArgs, @fileList) if ( @fileList ); push(@$rsyncArgs, "$conf->{RsyncdUserName}\@$t->{hostIP}::$shareName", "/"); } if ( $bpc->{PoolV3} ) { unshift(@$rsyncArgs, '--bpc-hardlink-max', $conf->{HardLinkMax} || 31999, '--bpc-v3pool-used', $conf->{PoolV3Enabled}, ); } my $inode0 = 1; for ( my $i = 0 ; $i < @{$t->{backups}} ; $i++ ) { $inode0 = $t->{backups}[$i]{inodeLast} + 1 if ( $inode0 <= $t->{backups}[$i]{inodeLast} ); } unshift( @$rsyncArgs, '--bpc-top-dir', $conf->{TopDir}, # perltidy protect '--bpc-host-name', $t->{client}, '--bpc-share-name', $t->{shareName}, '--bpc-bkup-num', $t->{backups}[$t->{newBkupIdx}]{num}, '--bpc-bkup-comp', $t->{backups}[$t->{newBkupIdx}]{compress}, '--bpc-bkup-prevnum', defined($t->{lastBkupIdx}) ? $t->{backups}[$t->{lastBkupIdx}]{num} : -1, '--bpc-bkup-prevcomp', defined($t->{lastBkupIdx}) ? $t->{backups}[$t->{lastBkupIdx}]{compress} : -1, '--bpc-bkup-inode0', $inode0, '--bpc-log-level', $conf->{XferLogLevel}, '--bpc-attrib-new', ); } $logMsg .= " (client path $shareNamePath)" if ( $t->{shareName} ne $shareNamePath ); #from_to($args->{shareName}, "utf8", $conf->{ClientCharset}) # if ( $conf->{ClientCharset} ne "" ); if ( $conf->{RsyncBackupPCPath} eq "" || !-x $conf->{RsyncBackupPCPath} ) { $t->{_errStr} = "\$Conf{RsyncBackupPCPath} is set to $conf->{RsyncBackupPCPath}, which isn't a valid executable"; return; } $rsyncCmd = [$conf->{RsyncBackupPCPath}, @$rsyncArgs]; my $rsyncFd; if ( !defined($t->{xferPid} = open($rsyncFd, "-|")) ) { $t->{_errStr} = "Can't fork to run $conf->{RsyncBackupPCPath}"; return; } $t->{rsyncFd} = $rsyncFd; if ( !$t->{xferPid} ) { # # This is the rsync child. We capture both stdout # and stderr to put into the XferLOG file. # setpgrp 0, 0; close(STDERR); open(STDERR, ">&STDOUT"); # # Run the $conf->{RsyncBackupPCPath} command # print("This is the rsync child about to exec $conf->{RsyncBackupPCPath}\n"); $bpc->cmdExecOrEval($rsyncCmd); print("cmdExecOrEval failed $?\n"); # should not be reached, but just in case... $t->{_errStr} = "Can't exec @$rsyncCmd)"; return; } my $str = $bpc->execCmd2ShellCmd(@$rsyncCmd); #from_to($str, $conf->{ClientCharset}, "utf8") # if ( $conf->{ClientCharset} ne "" ); $t->{XferLOG}->write(\"Running: $str\n"); $t->{_errStr} = undef; return $logMsg; } sub run { my($t) = @_; my $conf = $t->{conf}; my $bpc = $t->{bpc}; alarm(0); while ( 1 ) { my($mesg, $done); if ( sysread($t->{rsyncFd}, $mesg, 32768) <= 0 ) { next if ( $!{EINTR} ); if ( !close($t->{rsyncFd}) ) { # # rsync exits with the RERR_* codes in errcode.h. Exit codes 23, 24, 25 are minor (ie: some # error in transfer, but not fatal). Other non-zero exit codes are considered failures. # $t->{lastOutputLine} = $t->{lastErrorLine} if ( defined($t->{lastErrorLine}) ); my $exitCode = $? >> 8; if ( $exitCode == 23 || $exitCode == 24 || $exitCode == 25 ) { $t->{rsyncOut} .= "rsync_bpc exited with benign status $exitCode ($?)\n"; $t->{rsyncOut} .= "That means the client rsync had errors on some files. Please check the XferLOG.\n"; $t->{rsyncOut} .= "It likely means that rsync's delete cleanup (which deletes files on the backup\n"; $t->{rsyncOut} .= "server that are no longer on the client) was skipped. You should fix the error(s)\n"; $t->{rsyncOut} .= "that rsync can run cleanly. You can also specify the --ignore-errors option\n"; $t->{rsyncOut} .= "which will still do the delete even if there are rsync errors, but do that with caution.\n"; $t->{xferOK} = 1; $t->{stats}{xferErrs}++; } else { $t->{rsyncOut} .= "rsync_bpc exited with fatal status $exitCode ($?) ($t->{lastOutputLine})\n"; $t->{xferOK} = 0; $t->{stats}{xferErrs}++; } } else { $t->{xferOK} = 1; } $done = 1; } else { $t->{rsyncOut} .= $mesg; } while ( $t->{rsyncOut} =~ /(.*?)[\n\r]+(.*)/s ) { $_ = $1; $t->{rsyncOut} = $2; # # refresh our inactivity alarm # if ( /^log:\s(recv|del\.|send)\s(.{11})\s.{9}\s*\d+,\s*\d+\s*(\d+)\s(.*)/ ) { my $type = $1; my $changes = $2; my $size = $3; my $fileName = $4; if ( $changes =~ /^\./ ) { $t->{logInfo}{$fileName}{seqNum} = ++$t->{logInfoSeq}; push(@{$t->{logInfo}{$fileName}{status}}, "same"); } if ( $type eq "del." ) { $t->{logInfo}{$fileName}{seqNum} = ++$t->{logInfoSeq}; push(@{$t->{logInfo}{$fileName}{status}}, "del"); } s/^log: //; push( @{$t->{logSave}}, { mesg => $_, type => $type, fileName => $fileName, } ); $t->logSaveFlush(); next; } if ( /^IOdone:\s(\S*)\s(.*)/ ) { my $status = $1; my $fileName = $2; $t->{logInfo}{$fileName}{seqNum} = ++$t->{logInfoSeq}; push(@{$t->{logInfo}{$fileName}{status}}, $status); $t->{XferLOG}->write(\"$_\n") if ( $conf->{XferLogLevel} >= 6 ); $t->logSaveFlush(); next; } if ( /^__bpc_progress_fileCnt__ \d+/ ) { print("$_\n") if ( !$t->{noProgressPrint} ); $t->{XferLOG}->write(\"$_\n") if ( $conf->{XferLogLevel} >= 6 ); next; } if ( /^ERROR: / ) { if ( /failed verification -- update discarded./ ) { $t->{xferBadFileCnt}++; } $t->{stats}{xferErrs}++; } if ( /^rsync error: / || /^rsync warning: / ) { $t->{stats}{xferErrs}++; } if ( /^IO error encountered -- skipping file deletion/ ) { $t->{stats}{xferErrs}++; } if ( /^rsync: send_files failed to open / || /^file has vanished: / ) { $t->{stats}{xferErrs}++; } if ( /^IOrename:\s(\d+)\s(.*)/ ) { my $oldName = substr($2, 0, $1); my $newName = substr($2, $1); $t->{logInfo}{$newName} = $t->{logInfo}{$oldName}; delete($t->{logInfo}{$oldName}); $t->{XferLOG}->write(\"$_\n") if ( $conf->{XferLogLevel} >= 6 ); $t->logSaveFlush(); next; } if ( /^xferPids (\d+),(\d+)/ ) { my $pidHandler = $t->{pidHandler}; if ( ref($pidHandler) eq 'CODE' ) { &$pidHandler($1, $2); } else { $t->{XferLOG}->write(\"$_\n") if ( $conf->{XferLogLevel} >= 4 ); } } if ( /^Done(Gen)?: (\d+) errors, (\d+) filesExist, (\d+) sizeExist, (\d+) sizeExistComp, (\d+) filesTotal, (\d+) sizeTotal, (\d+) filesNew, (\d+) sizeNew, (\d+) sizeNewComp, (\d+) inode/ ) { $t->{stats}{xferErrs} += $2; $t->{stats}{nFilesExist} += $3; $t->{stats}{sizeExist} += $4; $t->{stats}{sizeExistComp} += $5; $t->{stats}{nFilesTotal} += $6; $t->{stats}{sizeTotal} += $7; $t->{stats}{nFilesNew} += $8; $t->{stats}{sizeNew} += $9; $t->{stats}{sizeNewComp} += $10; $t->{stats}{inode} = $11 if ( $t->{stats}{inode} < $11 ); $t->{XferLOG}->write(\"$_\n"); $t->{XferLOG}->write(\"Parsing done: nFilesTotal = $t->{stats}{nFilesTotal}\n") if ( $conf->{XferLogLevel} >= 3 ); $t->{fileCnt} = $t->{stats}{nFilesTotal}; $t->{byteCnt} = $t->{stats}{sizeTotal}; next; } # if ( /: \.\/(.*): Read error at byte / ) { # my $badFile = $1; # push(@{$t->{badFiles}}, { # share => $t->{shareName}, # file => $badFile # }); # } # from_to($_, $conf->{ClientCharset}, "utf8") # if ( $conf->{ClientCharset} ne "" ); $t->{lastOutputLine} = $_ if ( !/^\s+$/ && length($_) ); $t->{lastErrorLine} = $_ if ( /^rsync_bpc: / || /^rsync error: / ); $t->{XferLOG}->write(\"$_\n"); } last if ( $done ); } unlink($t->{pwFile}) if ( length($t->{pwFile}) && -f $t->{pwFile} ); unlink($t->{filesFrom}) if ( length($t->{filesFrom}) && -f $t->{filesFrom} ); $t->logSaveFlush(1); $t->{lastOutputLine} = $t->{lastErrorLine} if ( defined($t->{lastErrorLine}) ); # # Remove any rsyncTmp files in the backup directory # my $bkupDir = $t->{type} eq "restore" ? "$conf->{TopDir}/pc/$t->{bkupSrcHost}/$t->{bkupSrcNum}" : "$conf->{TopDir}/pc/$t->{client}/$t->{backups}[$t->{newBkupIdx}]{num}"; my $bkupDirEntries = BackupPC::DirOps::dirRead($bpc, $bkupDir); my $pidRunning = {}; if ( ref($bkupDirEntries) eq 'ARRAY' ) { foreach my $e ( @$bkupDirEntries ) { next if ( $e->{name} !~ /^rsyncTmp\.(\d+)\.\d+\.\d+$/ ); my $pid = $1; $pidRunning->{$pid} = kill(0, $pid) ? 1 : 0 if ( !defined($pidRunning->{$pid}) ); next if ( $pidRunning->{$pid} ); $t->{XferLOG}->write(\"Removing rsync temporary file $bkupDir/$e->{name}\n"); unlink("$bkupDir/$e->{name}"); } } if ( $t->{type} eq "restore" ) { if ( $t->{xferOK} ) { return ($t->{fileCnt}, $t->{byteCnt}, 0, undef,); } else { return ($t->{fileCnt}, $t->{byteCnt}, $t->{stats}{xferErrs}, $t->{lastOutputLine},); } } else { $t->{xferErrCnt} = $t->{stats}{xferErrs}; return ( $t->{stats}{xferErrs}, $t->{stats}{nFilesExist}, $t->{stats}{sizeExist}, $t->{stats}{sizeExistComp}, $t->{stats}{nFilesTotal}, $t->{stats}{sizeTotal}, $t->{stats}{nFilesNew}, $t->{stats}{sizeNew}, $t->{stats}{sizeNewComp}, $t->{stats}{inode}, ); } } sub errStr { my($t) = @_; return $t->{_errStr}; } sub xferPid { my($t) = @_; return $t->{xferPid}; } # # usage: # $t->abort($reason); # # Aborts the current job, by sending an INT signal to the first rsync process # (which in turn kills the receiver child). # sub abort { my($t, $reason) = @_; my @xferPid = $t->xferPid; $t->{abort} = 1; $t->{abortReason} = $reason; if ( @xferPid ) { kill($t->{bpc}->sigName2num("INT"), $xferPid[0]); } } sub logSaveFlush { my($t, $all) = @_; my $change = 1; my $conf = $t->{conf}; $all = 1 if ( $t->{type} eq "restore" ); while ( $change && @{$t->{logSave}} ) { $change = 0; my $fileName = $t->{logSave}[0]{fileName}; if ( defined($t->{logInfo}{$fileName}) || $all || @{$t->{logSave}} > 200 ) { my $mesg = sprintf(" %-6s %s", shift(@{$t->{logInfo}{$fileName}{status}}), $t->{logSave}[0]{mesg}); delete($t->{logInfo}{$fileName}) if ( !@{$t->{logInfo}{$fileName}{status}} ); shift(@{$t->{logSave}}); #from_to($mesg, $conf->{ClientCharset}, "utf8") # if ( $conf->{ClientCharset} ne "" ); $t->{lastOutputLine} = $mesg if ( !/^\s+$/ && length($mesg) ); $t->{XferLOG}->write(\"$mesg\n"); $change = 1; } } if ( %{$t->{logInfo}} > 2000 ) { # # prune the fileName logInfo array if it gets too big # my @info = sort { $t->{logInfo}{$a}{seqNum} <=> $t->{logInfo}{$b}{seqNum} } keys(%{$t->{logInfo}}); while ( @info > 500 ) { my $fileName = shift(@info); delete($t->{logInfo}{$fileName}); } } } 1; BackupPC-4.4.0/lib/BackupPC/Xfer/Ftp.pm0000444000047500004750000011670713673511776016334 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Ftp package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Ftp class for transferring # data from a FTP client. # # AUTHOR # Paul Mantz # # COPYRIGHT # (C) 2008, Zmanda Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Ftp; use strict; use BackupPC::Lib; use BackupPC::View; use BackupPC::DirOps; use BackupPC::XS qw(:all); use Encode qw/from_to encode/; use File::Listing qw/parse_dir/; use Fcntl ':mode'; use File::Path; use Data::Dumper; use base qw(BackupPC::Xfer::Protocol); use vars qw( $FTPLibOK $FTPLibErr $ARCLibOK ); BEGIN { $FTPLibOK = 1; $ARCLibOK = 0; # # clear eval error variable # my @FTPLibs = qw( Net::FTP Net::FTP::RetrHandle ); foreach my $module ( @FTPLibs ) { undef $@; eval "use $module;"; if ( $@ ) { $FTPLibOK = 0; $FTPLibErr = "module $module doesn't exist: $@"; last; } } eval "use Net::FTP::AutoReconnect;"; $ARCLibOK = (defined($@)) ? 1 : 0; # # TODO # $ARCLibOK = 0; } ############################################################################## # Constructor ############################################################################## # # usage: # $xfer = new BackupPC::Xfer::Ftp( $bpc, %args ); # # new() is your default class constructor. it also calls the # constructor for Protocol as well. # sub new { my($class, $bpc, $args) = @_; $args ||= {}; my $t = BackupPC::Xfer::Protocol->new( $bpc, { ftp => undef, stats => { errorCnt => 0, TotalFileCnt => 0, TotalFileSize => 0, ExistFileCnt => 0, ExistFileSize => 0, ExistFileCompSize => 0, }, %$args, } ); return bless($t, $class); } ############################################################################## # Methods ############################################################################## # # usage: # $xfer->start(); # # start() is called to configure and initiate a dump or restore, # depending on the configured options. # sub start { my($t) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my $TopDir = $bpc->TopDir(); my(@fileList, $logMsg, $args, $dumpText); # # initialize the statistics returned by getStats() # foreach ( qw/byteCnt fileCnt xferErrCnt xferBadShareCnt xferBadFileCnt xferOK hostAbort hostError lastOutputLine/ ) { $t->{$_} = 0; } # # Net::FTP::RetrHandle is necessary. # if ( !$FTPLibOK ) { $t->{_errStr} = "Error: FTP transfer selected but module Net::FTP::RetrHandle is not installed."; $t->{xferErrCnt}++; return; } # # standardize the file include/exclude settings if necessary # unless ( $t->{type} eq 'restore' ) { $bpc->backupFileConfFix($conf, "FtpShareName"); $t->loadInclExclRegexps("FtpShareName"); } # # Convert the encoding type of the names if at all possible # $t->{shareNamePath} = $t->shareName2Path($t->{shareName}); from_to($args->{shareNamePath}, "utf8", $conf->{ClientCharset}) if ( $conf->{ClientCharset} ne "" ); # # Collect FTP configuration arguments and translate them for # passing to the FTP module. # unless ( $args = $t->getFTPArgs() ) { return; } # # Create the Net::FTP::AutoReconnect or Net::FTP object. # undef $@; eval { $t->{ftp} = ($ARCLibOK) ? Net::FTP::AutoReconnect->new(%$args) : Net::FTP->new(%$args); }; if ( $@ || !defined($t->{ftp}) ) { $t->{_errStr} = "Can't open ftp connection to $args->{Host}: $!"; $t->{xferErrCnt}++; return; } $t->logWrite("Connected to $args->{Host}\n", 2); # # Log in to the ftp server and set appropriate path information. # undef $@; my $ret; eval { $ret = $t->{ftp}->login($conf->{FtpUserName}, $conf->{FtpPasswd}); }; if ( !$ret ) { $t->{_errStr} = "Can't ftp login to $args->{Host} (user = $conf->{FtpUserName}), $@"; $t->{xferErrCnt}++; return; } $t->logWrite("Login successful to $conf->{FtpUserName}\@$args->{Host}\n", 2); eval { $ret = $t->{ftp}->binary(); }; if ( !$ret ) { $t->{_errStr} = "Can't enable ftp binary transfer mode to $args->{Host}: " . $t->{ftp}->message(); $t->{xferErrCnt}++; return; } $t->logWrite("Binary command successful\n", 2); eval { $ret = $t->{ftp}->cwd($t->{shareNamePath}); }; if ( !$ret ) { $t->{_errStr} = "Can't change working directory to $t->{shareNamePath}: " . $t->{ftp}->message(); $t->{xferErrCnt}++; return; } $t->logWrite("Set cwd to $t->{shareNamePath}\n", 2); # # log the beginning of action based on type # if ( $t->{type} eq 'restore' ) { $logMsg = "ftp restore for host $t->{host} started on directory $t->{shareName}"; } elsif ( $t->{type} eq 'full' ) { $logMsg = "ftp full backup for host $t->{host} started on directory $t->{shareName}"; } elsif ( $t->{type} eq 'incr' ) { $logMsg = "ftp incremental backup for $t->{host} started for directory $t->{shareName}"; } $logMsg .= " (client path $t->{shareNamePath})" if ( $t->{shareName} ne $t->{shareNamePath} ); $t->logWrite($logMsg . "\n", 1); # # call the recursive function based on the type of action # if ( $t->{type} eq 'restore' ) { $t->restore(); $logMsg = "Restore of $t->{host} " . ($t->{xferOK} ? "complete" : "failed"); } else { $t->{compress} = $t->{backups}[$t->{newBkupIdx}]{compress}; $t->{newBkupNum} = $t->{backups}[$t->{newBkupIdx}]{num}; $t->{lastBkupNum} = $t->{backups}[$t->{lastBkupIdx}]{num}; $t->{AttrNew} = BackupPC::XS::AttribCache::new($t->{client}, $t->{newBkupNum}, $t->{shareName}, $t->{compress}); $t->{DeltaNew} = BackupPC::XS::DeltaRefCnt::new("$TopDir/pc/$t->{client}/$t->{newBkupNum}"); $t->{AttrNew}->setDeltaInfo($t->{DeltaNew}); $t->{Inode} = 1; for ( my $i = 0 ; $i < @{$t->{backups}} ; $i++ ) { $t->{Inode} = $t->{backups}[$i]{inodeLast} + 1 if ( $t->{Inode} <= $t->{backups}[$i]{inodeLast} ); } $t->{Inode0} = $t->{Inode}; if ( !$t->{inPlace} ) { $t->{AttrOld} = BackupPC::XS::AttribCache::new($t->{client}, $t->{lastBkupNum}, $t->{shareName}, $t->{compress}); $t->{DeltaOld} = BackupPC::XS::DeltaRefCnt::new("$TopDir/pc/$t->{client}/$t->{lastBkupNum}"); $t->{AttrOld}->setDeltaInfo($t->{DeltaOld}); } $t->logWrite("ftp inPlace = $t->{inPlace}, newBkupNum = $t->{newBkupNum}, lastBkupNum = $t->{lastBkupNum}\n", 4); $bpc->flushXSLibMesgs(); $t->backup(); $t->{AttrNew}->flush(1); $bpc->flushXSLibMesgs(); if ( $t->{AttrOld} ) { $t->{AttrOld}->flush(1); $bpc->flushXSLibMesgs(); } if ( $t->{logLevel} >= 6 ) { print("RefCnt Deltas for new #$t->{newBkupNum}\n"); $t->{DeltaNew}->print(); if ( $t->{DeltaOld} ) { print("RefCnt Deltas for old #$t->{lastBkupNum}\n"); $t->{DeltaOld}->print(); } } $bpc->flushXSLibMesgs(); $t->{DeltaNew}->flush(); $t->{DeltaOld}->flush() if ( $t->{DeltaOld} ); if ( $t->{type} eq 'incr' ) { $logMsg = "Incremental backup of $t->{host} " . ($t->{xferOK} ? "complete" : "failed"); } else { $logMsg = "Full backup of $t->{host} " . ($t->{xferOK} ? "complete" : "failed"); } return if ( !$t->{xferOK} && defined($t->{_errStr}) ); } delete $t->{_errStr}; return $logMsg; } # # # sub run { my($t) = @_; my $stats = $t->{stats}; my($tarErrs, $nFilesExist, $sizeExist, $sizeExistCom, $nFilesTotal, $sizeTotal); # # TODO: replace the $stats array with variables at the top level, # ones returned by $getStats. They should be identical. # $tarErrs = 0; $nFilesExist = $stats->{ExistFileCnt}; $sizeExist = $stats->{ExistFileSize}; $sizeExistCom = $stats->{ExistFileCompSize}; $nFilesTotal = $stats->{TotalFileCnt}; $sizeTotal = $stats->{TotalFileSize}; if ( $t->{type} eq "restore" ) { return ($t->{fileCnt}, $t->{byteCnt}, 0, 0); } else { return ($tarErrs, $nFilesExist, $sizeExist, $sizeExistCom, $nFilesTotal, $sizeTotal); } } sub restore { my($t) = @_; my $bpc = $t->{bpc}; my $fileList = $t->{fileList}; $t->{view} = BackupPC::View->new($bpc, $t->{bkupSrcHost}, $t->{backups}); my $view = $t->{view}; foreach my $file ( @$fileList ) { my $attr = $view->fileAttrib($t->{bkupSrcNum}, $t->{bkupSrcShare}, $file); $t->logWrite("restore($file)\n", 4); if ( $attr->{type} == BPC_FTYPE_DIR ) { $t->restoreDir($file, $attr); } elsif ( $attr->{type} == BPC_FTYPE_FILE ) { $t->restoreFile($file, $attr); } else { # # can't restore any other file types # $t->logWrite("restore($file): failed... unsupported file type $attr->{type}\n", 0); $t->{xferErrCnt}++; } } $t->{xferOK} = 1; return 1; } sub restoreDir { my($t, $dirName, $dirAttr) = @_; my $ftp = $t->{ftp}; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my $view = $t->{view}; my $dirList = $view->dirAttrib($t->{bkupSrcNum}, $t->{bkupSrcShare}, $dirName); (my $targetPath = "$t->{shareNamePath}/$dirName") =~ s{//+}{/}g; my($fileName, $fileAttr, $fileType); $t->logWrite("restoreDir($dirName) -> $targetPath\n", 4); # # Create the remote directory # undef $@; eval { $ftp->mkdir($targetPath, 1); }; if ( $@ ) { $t->logFileAction("fail", $dirName, $dirAttr); return; } else { $t->logFileAction("restore", $dirName, $dirAttr); } while ( ($fileName, $fileAttr) = each %$dirList ) { $t->logWrite("restoreDir: entry = $dirName/$fileName\n", 4); if ( $fileAttr->{type} == BPC_FTYPE_DIR ) { $t->restoreDir("$dirName/$fileName", $fileAttr); } elsif ( $fileAttr->{type} == BPC_FTYPE_FILE ) { $t->restoreFile("$dirName/$fileName", $fileAttr); } else { # # can't restore any other file types # $t->logWrite("restore($fileName): failed... unsupported file type $fileAttr->{type}\n", 0); } } } sub restoreFile { my($t, $fileName, $fileAttr) = @_; my $conf = $t->{conf}; my $ftp = $t->{ftp}; my $bpc = $t->{bpc}; my $TopDir = $bpc->TopDir(); my $poolFile = $fileAttr->{fullPath}; my $tempFile = "$TopDir/pc/$t->{client}/FtpRestoreTmp$$"; my $fout; my $fileDest = ($conf->{ClientCharset} ne "") ? from_to("$t->{shareNamePath}//$fileName", "utf8", $conf->{ClientCharset}) : "$t->{shareNamePath}/$fileName"; $t->logWrite("restoreFile($fileName) -> $fileDest\n", 4); if ( $fileAttr->{compress} ) { my $f = BackupPC::XS::FileZIO::open($poolFile, 0, $fileAttr->{compress}); if ( !defined($f) ) { $t->logWrite("restoreFile: Unable to open file $poolFile (during restore of $fileName)\n", 0); $t->{stats}{errCnt}++; return; } if ( !open($fout, ">", $tempFile) ) { $t->logWrite("restoreFile: Can't create/open temp file $tempFile (during restore of $fileName)\n", 0); $t->{stats}{errCnt}++; $f->close(); return; } my $data; my $outData = ""; while ( $f->read(\$data, 65536) > 0 ) { my $ret = syswrite($fout, $data); if ( !defined($ret) || $ret != length($data) ) { $t->logWrite("restoreFile: Can't write file $tempFile ($ret, $@) (during restore of $fileName)\n", 0); $t->{stats}{errCnt}++; $f->close(); close($fout); return; } } $f->close(); close($fout); } else { $tempFile = $poolFile; } undef $@; eval { if ( $ftp->put($tempFile, $fileDest) ) { $t->logFileAction("restore", $fileName, $fileAttr); } else { $@ = 1 if ( !$@ ); # force the fail message below } }; unlink($tempFile); if ( $@ ) { $t->logWrite("restoreFile($fileName) failed ($@)\n", 4); $t->logFileAction("fail", $fileName, $fileAttr); } } # # usage: # $t->backup($path); # # $t->backup() is a recursive function that takes a path as an # argument, and performs a backup on that folder consistent with the # configuration parameters. $path is considered rooted at # $t->{shareName}, so no $ftp->cwd() command is necessary. # sub backup { my($t) = @_; my $ftp = $t->{ftp}; my $bpc = $t->{bpc}; my $conf = $t->{conf}; # # determine the filetype of the shareName and back it up # appropriately. For now, assume that $t->{shareName} is a # directory. # my $f = { name => "/", type => BPC_FTYPE_DIR, mode => 0775, mtime => time, compress => $t->{compress}, }; if ( $t->handleDir($f) ) { $t->logWrite("adding top-level attrib for share $t->{shareName}\n", 4); my $fNew = { name => $t->{shareName}, type => BPC_FTYPE_DIR, mode => 0775, uid => 0, gid => 0, size => 0, mtime => time(), inode => $t->{Inode}++, nlinks => 0, compress => $t->{compress}, }; $t->{AttrNew}->set("/", $fNew); $t->{xferOK} = 1; return 1; } else { $t->{xferBadShareCnt}++; return; } } #################################################################################### # FTP-specific functions #################################################################################### # # This is an encapulation of the logic necessary to grab the arguments # from %Conf and throw it in a hash pointer to be passed to the # Net::FTP object. # sub getFTPArgs { my($t) = @_; my $conf = $t->{conf}; return { Host => $t->{hostIP} || $t->{host}, Firewall => undef, # not used FirewallType => undef, # not used BlockSize => $conf->{FtpBlockSize} || 10240, Port => $conf->{FtpPort} || 21, Timeout => defined($conf->{FtpTimeout}) ? $conf->{FtpTimeout} : 120, Debug => $t->{logLevel} >= 5 ? 1 : 0, Passive => (defined($conf->{FtpPassive}) ? $conf->{FtpPassive} : 1), Hash => undef, # do not touch }; } # # usage: # $dirList = $t->remotels($path); # # remotels() returns a reference to a list of hash references that # describe the contents of each file in the directory of the path # specified. # sub remotels { my($t, $name) = @_; my $ftp = $t->{ftp}; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my $nameClient = $name; my $char2type = { 'f' => BPC_FTYPE_FILE, 'd' => BPC_FTYPE_DIR, 'l' => BPC_FTYPE_SYMLINK, }; my($dirContents, $remoteDir, $f, $linkname); from_to($nameClient, "utf8", $conf->{ClientCharset}) if ( $conf->{ClientCharset} ne "" ); $remoteDir = []; undef $@; $t->logWrite("remotels: about to list $name\n", 4); eval { $dirContents = ($nameClient =~ /^\.?$/ || $nameClient =~ /^\/*$/) ? $ftp->dir() : $ftp->dir("$nameClient/"); }; if ( !defined($dirContents) ) { $t->{xferErrCnt}++; $t->logWrite("remotels: can't retrieve remote directory contents of $name: $!\n", 1); return "can't retrieve remote directory contents of $name: $!"; } if ( $t->{logLevel} >= 4 ) { my $str = join("\n", @$dirContents); $t->logWrite("remotels: got dir() result:\n$str\n", 4); } foreach my $info ( @{parse_dir($dirContents)} ) { my $dirStr = shift(@$dirContents); my($uid, $gid); next if ( $info->[0] eq "." || $info->[0] eq ".." ); if ( $info->[1] =~ /^l (.*)/ ) { $linkname = $1; } # # Try to extract number uid/gid, if present. If there are special files (eg, devices or pipe) that are # in the directoy listing, they won't be in $dirContents. So $dirStr might not be the matching text # for $info. So we peel off more elements if they don't appear to match. This is very fragile. # Better solution would be to update $ftp->dir() to extract uid/gid if present. # while ( @$dirContents && $dirStr !~ m{\s+\Q$info->[0]\E$} && $dirStr !~ m{^l.*\s+\Q$info->[0] -> $linkname\E$} ) { $t->logWrite("no match between $dirStr and $info->[0]\n", 4); $dirStr = shift(@$dirContents); } my $fTypeChar = substr($info->[1], 0, 1); if ( $dirStr =~ m{^.{10}\s+\d+\s+(\d+)\s+(\d+)\s+(\d+).*\Q$info->[0]\E} && ($fTypeChar ne "f" || $info->[2] == $3) ) { $uid = $1; $gid = $2; } from_to($info->[0], $conf->{ClientCharset}, "utf8") if ( $conf->{ClientCharset} ne "" ); from_to($linkname, $conf->{ClientCharset}, "utf8") if ( $linkname ne "" && $conf->{ClientCharset} ne "" ); my $dir = "$name/"; $dir = "" if ( $name eq "" ); $dir =~ s{^/+}{}; $f = { name => "$dir$info->[0]", type => defined($char2type->{$fTypeChar}) ? $char2type->{$fTypeChar} : BPC_FTYPE_UNKNOWN, size => $info->[2], mtime => $info->[3], mode => $info->[4], uid => $uid, gid => $gid, compress => $t->{compress}, }; $f->{linkname} = $linkname if ( defined($linkname) ); $t->logWrite( "remotels: adding name $f->{name}, type $f->{type} ($info->[1]), size $f->{size}, mode $f->{mode}, $uid/$gid\n", 4 ); push(@$remoteDir, $f); } return $remoteDir; } # # handleSymlink() backs up a symlink. # sub handleSymlink { my($t, $f) = @_; my $a = $t->{AttrNew}->get($f->{name}); my $stats = $t->{stats}; my($same, $exists, $digest, $outSize, $errs); # # Symbolic link: write the value of the link to a plain file, # that we pool as usual (ie: we don't create a symlink). # The attributes remember the original file type. # We also change the size to reflect the size of the link # contents. # $f->{size} = length($f->{linkname}); if ( $a && $a->{type} == BPC_FTYPE_SYMLINK ) { # # Check if it is the same # my $oldLink = $t->fileReadAll($a, $f); if ( $oldLink eq $f->{linkname} ) { logFileAction("same", $f) if ( $t->{logLevel} >= 1 ); $stats->{ExistFileCnt}++; $stats->{ExistFileSize} += $f->{size}; $stats->{ExistFileCompSize} += -s $a->{poolPath} if ( -f $a->{poolPath} ); $same = 1; } } if ( !$same ) { $t->moveFileToOld($a, $f); $t->logWrite("PoolWrite->new(name = $f->{name}, compress = $t->{compress})\n", 5); my $poolWrite = BackupPC::XS::PoolWrite::new($t->{compress}); $poolWrite->write(\$f->{linkname}); ($exists, $digest, $outSize, $errs) = $poolWrite->close(); $f->{digest} = $digest; if ( $errs ) { $t->logFileAction("fail", $f->{name}, $f); $t->{xferBadFileCnt}++; $stats->{errCnt} += scalar @$errs; return; } } # # Update attribs # $t->attribUpdate($a, $f, $same); # # Perform logging # $t->logFileAction($same ? "same" : $exists ? "pool" : "new", $f->{name}, $f); # # Cumulate the stats # $stats->{TotalFileCnt}++; $stats->{TotalFileSize} += $f->{size}; if ( $exists ) { $stats->{ExistFileCnt}++; $stats->{ExistFileCompSize} += -s $a->{poolPath} if ( -f $a->{poolPath} ); $stats->{ExistFileSize} += $f->{size}; } else { $stats->{NewFileCnt}++; $stats->{NewFileCompSize} += -s $a->{poolPath} if ( -f $a->{poolPath} ); $stats->{NewFileSize} += $f->{size}; } $t->{byteCnt} += $f->{size}; $t->{fileCnt}++; return 1; } # # handleDir() backs up a directory, and initiates a backup of its # contents. # sub handleDir { my($t, $f) = @_; my $ftp = $t->{ftp}; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my $stats = $t->{stats}; my $AttrNew = $t->{AttrNew}; my $same = 0; my $a = $AttrNew->get($f->{name}); my($exists, $digest, $outSize, $errs); my($poolWrite, $poolFile); my($localDir, $remoteDir, %expectedFiles); $a->{poolPath} = $bpc->MD52Path($a->{digest}, $a->{compress}) if ( length($a->{digest}) ); my $pathNew = $AttrNew->getFullMangledPath($f->{name}); if ( -d $pathNew ) { $t->logFileAction("same", $f->{name}, $f); $same = 1; } else { if ( -e $pathNew ) { $t->logWrite("handleDir: $pathNew ($f->{name}) isn't a directory... renaming and recreating\n", 3) if ( defined($a) ); } else { $t->logWrite("handleDir: creating directory $pathNew ($f->{name})\n", 3) if ( defined($a) ); } $t->moveFileToOld($a, $f); $t->logFileAction("new", $f->{name}, $f) if ( $t->{logLevel} >= 1 ); # # make sure all the parent directories exist and have directory attribs # $t->pathCreate($pathNew, 1); my $name = $f->{name}; $name = "/$name" if ( $name !~ m{^/} ); while ( length($name) > 1 ) { if ( $name =~ m{/} ) { $name =~ s{(.*)/.*}{$1}; } else { $name = "/"; } my $a = $AttrNew->get($name); last if ( defined($a) && $a->{type} == BPC_FTYPE_DIR ); $t->logWrite("handleDir: adding BPC_FTYPE_DIR attrib entry for $name\n", 3); my $fNew = { name => $name, type => BPC_FTYPE_DIR, mode => $f->{mode}, uid => $f->{uid}, gid => $f->{gid}, size => 0, mtime => $f->{mtime}, inode => $t->{Inode}++, nlinks => 0, compress => $t->{compress}, }; $AttrNew->set($name, $fNew); $t->moveFileToOld($a, $fNew); } } # # Update attribs # $t->attribUpdate($a, $f, $same); $t->logWrite("handleDir: name = $f->{name}, pathNew = $pathNew\n", 4); $remoteDir = $t->remotels($f->{name}); if ( ref($remoteDir) ne 'ARRAY' ) { $t->logWrite("handleDir failed: $remoteDir\n", 1); $t->logFileAction("fail", $f->{name}, $f); $t->{xferErrCnt}++; return; } my $all = $AttrNew->getAll($f->{name}); $bpc->flushXSLibMesgs(); # # take care of each file in the directory # foreach my $f ( @{$remoteDir} ) { my $fullName = "$t->{shareName}/$f->{name}"; $fullName =~ s{/+}{/}g; next if ( !$t->checkIncludeExclude($fullName) ); # # handle based on filetype # if ( $f->{type} == BPC_FTYPE_FILE ) { $t->handleFile($f); } elsif ( $f->{type} == BPC_FTYPE_DIR ) { $t->handleDir($f); } elsif ( $f->{type} == BPC_FTYPE_SYMLINK ) { $t->handleSymlink($f); } else { $t->logWrite("handleDir: unexpected file type $f->{type} for $f->{name})\n", 1); $t->{xferBadFileCnt}++; } # # Mark file as seen in expected files hash # $t->logWrite("dirLoop: handled $f->{name}\n", 5); $expectedFiles{$f->{name}}++; } # end foreach (@{$remoteDir}) # # If we didn't see a file, move to old. # foreach my $name ( keys(%$all) ) { next if ( $name eq "." || $name eq ".." ); my $path = "$f->{name}/$name"; $path =~ s{^/+}{}; $t->logWrite("dirCleanup: checking $path, expected = $expectedFiles{$path}\n", 5); next if ( $expectedFiles{$path} ); $t->moveFileToOld($AttrNew->get($path), {name => $path}); } # # Explicit success # return 1; } # # handleFile() backs up a file. # sub handleFile { my($t, $f) = @_; my $bpc = $t->{bpc}; my $ftp = $t->{ftp}; my $view = $t->{view}; my $stats = $t->{stats}; my($poolFile, $poolWrite, $data, $localSize); my($exists, $digest, $outSize, $errs); my($oldAttrib); local *FTP; my $a = $t->{AttrNew}->get($f->{name}); my $aOld = $t->{AttrOld}->get($f->{name}) if ( $t->{AttrOld} ); my $same = 0; # # If this is an incremental backup and the file exists in a # previous backup unchanged, write the attribInfo for the file # accordingly. # if ( $t->{type} eq "incr" ) { if ( $a && $f->{type} == $a->{type} && $f->{mtime} == $a->{mtime} && $f->{size} == $a->{size} && $f->{uid} == $a->{uid} && $f->{gid} == $a->{gid} ) { $t->logWrite("handleFile: $f->{name} has same attribs\n", 5); return 1; } } # # If this is a full backup or the file has changed on the host, # back it up. # # TODO: convert back to local charset? # undef $@; eval { tie(*FTP, 'Net::FTP::RetrHandle', $ftp, "$f->{name}"); }; if ( !*FTP || $@ ) { $t->logFileAction("fail", $f->{name}, $f); $t->{xferBadFileCnt}++; $stats->{errCnt}++; return; } $t->logWrite("PoolWrite->new(name = $f->{name}, compress = $t->{compress})\n", 5); $poolWrite = BackupPC::XS::PoolWrite::new($t->{compress}); $localSize = 0; undef $@; eval { while ( ) { $localSize += length($_); $poolWrite->write(\$_); } }; ($exists, $digest, $outSize, $errs) = $poolWrite->close(); $f->{digest} = $digest; if ( $a && $a->{digest} eq $digest ) { $same = 1 if ( $a->{nlinks} == 0 ); } if ( !$same ) { $t->moveFileToOld($a, $f); } if ( !*FTP || $@ || $errs ) { $t->logFileAction("fail", $f->{name}, $f); $t->{xferBadFileCnt}++; $stats->{errCnt} += ref($errs) eq 'ARRAY' ? scalar(@$errs) : 1; return; } # # this should never happen # if ( $localSize != $f->{size} ) { $t->logFileAction("fail", $f->{name}, $f); $t->logWrite("Size mismatch on $f->{name} ($localSize vs $f->{size})\n", 3); $stats->{xferBadFileCnt}++; $stats->{errCnt}++; return; } # # Update attribs # $t->attribUpdate($a, $f, $same); # # Perform logging # $t->logFileAction($same ? "same" : $exists ? "pool" : "new", $f->{name}, $f); # # Cumulate the stats # $stats->{TotalFileCnt}++; $stats->{TotalFileSize} += $f->{size}; if ( $exists ) { $stats->{ExistFileCnt}++; $stats->{ExistFileCompSize} += $outSize; $stats->{ExistFileSize} += $f->{size}; } else { $stats->{NewFileCnt}++; $stats->{NewFileCompSize} += $outSize; $stats->{NewFileSize} += $f->{size}; } $t->{byteCnt} += $localSize; $t->{fileCnt}++; } # # Generate a log file message for a completed file. Taken from # BackupPC_tarExtract. $f should be an attrib object. # sub logFileAction { my($t, $action, $name, $attrib) = @_; my $owner = "$attrib->{uid}/$attrib->{gid}"; my $type = BackupPC::XS::Attrib::fileType2Text($attrib->{type}); $type = $1 if ( $type =~ /(.)/ ); $type = "" if ( $type eq "f" ); $name = "." if ( $name eq "" ); $owner = "-/-" if ( $owner eq "/" ); $t->{bpc}->flushXSLibMesgs(); my $fileAction = sprintf( " %-6s %1s%4o %9s %11.0f %s\n", $action, $type, $attrib->{mode} & 07777, $owner, $attrib->{size}, $attrib->{name} ); if ( ($t->{stats}{TotalFileCnt} % 20) == 0 && !$t->{noProgressPrint} ) { printf("__bpc_progress_fileCnt__ %d\n", $t->{stats}{TotalFileCnt}); } return $t->logWrite($fileAction, 1); } # # Move $a to old; the new file $f will replace $a # sub moveFileToOld { my($t, $a, $f) = @_; my $AttrNew = $t->{AttrNew}; my $AttrOld = $t->{AttrOld}; my $DeltaNew = $t->{DeltaNew}; my $DeltaOld = $t->{DeltaOld}; my $bpc = $t->{bpc}; if ( !$a || keys(%$a) == 0 ) { # # A new file will be created, so add delete attribute to old # if ( $AttrOld ) { $AttrOld->set($f->{name}, {type => BPC_FTYPE_DELETED}); $t->logWrite("moveFileToOld: added $f->{name} as BPC_FTYPE_DELETED in old\n", 5); } return; } $t->logWrite("moveFileToOld: $a->{name}, $f->{name}, links = $a->{nlinks}, type = $a->{type}\n", 5); if ( $a->{type} != BPC_FTYPE_DIR ) { if ( $a->{nlinks} > 0 ) { if ( $AttrOld ) { if ( !$AttrOld->getInode($a->{inode}) ) { # # copy inode to old if it isn't already there # $AttrOld->setInode($a->{inode}, $a); $DeltaOld->update($a->{compress}, $a->{digest}, 1); } # # copy to old - no need for refeence count update since # inode is already there # $AttrOld->set($f->{name}, $a, 1) if ( !$AttrOld->get($f->{name}) ); } $a->{nlinks}--; if ( $a->{nlinks} <= 0 ) { $AttrNew->deleteInode($a->{inode}); $DeltaNew->update($a->{compress}, $a->{digest}, -1); } else { $AttrNew->setInode($a->{inode}, $a); } } else { $DeltaNew->update($a->{compress}, $a->{digest}, -1); if ( $AttrOld && !$AttrOld->get($f->{name}) && $AttrOld->set($f->{name}, $a, 1) ) { $DeltaOld->update($a->{compress}, $a->{digest}, 1); } } $AttrNew->delete($f->{name}); } else { if ( !$AttrOld || $AttrOld->get($f->{name}) ) { # # Delete the directory tree, including updating reference counts # my $pathNew = $AttrNew->getFullMangledPath($f->{name}); $t->logWrite("moveFileToOld(..., $f->{name}): deleting $pathNew\n", 3); BackupPC::DirOps::RmTreeQuiet($bpc, $pathNew, $a->{compress}, $DeltaNew, $AttrNew); } else { # # For a directory we need to move it to old, and copy # any inodes that are referenced below this directory. # Also update the reference counts for the moved files. # my $pathNew = $AttrNew->getFullMangledPath($f->{name}); my $pathOld = $AttrOld->getFullMangledPath($f->{name}); $t->logWrite("moveFileToOld(..., $f->{name}): renaming $pathNew to $pathOld\n", 5); $t->pathCreate($pathOld); $AttrNew->flush(0, $f->{name}); if ( !rename($pathNew, $pathOld) ) { $t->logWrite(sprintf( "moveFileToOld(..., %s: can't rename %s to %s ($!, %d, %d, %d)\n", $f->{name}, $pathNew, $pathOld, -e $pathNew, -e $pathOld, -d $pathOld )); $t->{xferErrCnt}++; } else { BackupPC::XS::DirOps::refCountAll($pathOld, $a->{compress}, -1, $DeltaNew); BackupPC::XS::DirOps::refCountAll($pathOld, $a->{compress}, 1, $DeltaOld); $t->copyInodes($f->{name}); $AttrOld->set($f->{name}, $a, 1); } } $AttrNew->delete($f->{name}); } } sub copyInodes { my($t, $dirName) = @_; my $AttrNew = $t->{AttrNew}; my $AttrOld = $t->{AttrOld}; my $DeltaNew = $t->{DeltaNew}; my $DeltaOld = $t->{DeltaOld}; my $bpc = $t->{bpc}; return if ( !defined($AttrOld) ); my $dirPath = $AttrNew->getFullMangledPath($dirName); $t->logWrite("copyInodes: dirName = $dirName, dirPath = $dirPath\n", 4); my $attrAll = $AttrNew->getAll($dirName); $bpc->flushXSLibMesgs(); # # Add non-attrib directories (ie: directories that were created # to store attributes in deeper directories), since these # directories may not appear in the attrib file at this level. # if ( defined(my $entries = BackupPC::DirOps::dirRead($bpc, $dirPath)) ) { foreach my $e ( @$entries ) { next if ( $e->{name} eq "." || $e->{name} eq ".." || $e->{name} eq "inode" || !-d "$dirPath/$e->{name}" ); my $fileUM = $bpc->fileNameUnmangle($e->{name}); next if ( $attrAll && defined($attrAll->{$fileUM}) ); $attrAll->{$fileUM} = { type => BPC_FTYPE_DIR, noAttrib => 1, }; } } foreach my $fileUM ( keys(%$attrAll) ) { next if ( $fileUM eq "." || $fileUM eq ".." ); my $a = $attrAll->{$fileUM}; if ( $a->{type} == BPC_FTYPE_DIR ) { # # recurse into this directory # $t->copyInodes("$dirName/$fileUM"); next; } $t->logWrite("copyInodes($dirName): $fileUM has inode=$a->{inode}, links = $a->{nlinks}\n", 6); next if ( $a->{nlinks} == 0 ); # # Copy the inode if it doesn't exist in old and increment the # digest reference count. my $aInode = $AttrNew->getInode($a->{inode}); if ( !defined($AttrOld->getInode($a->{inode})) ) { $t->logWrite("copyInodes($dirName): $fileUM moving inode $a->{inode} to old\n", 5); $AttrOld->setInode($a->{inode}, $aInode); $DeltaOld->update($aInode->{compress}, $aInode->{digest}, 1); } # # Also decrement the inode reference count in new. # $aInode->{nlinks}--; if ( $aInode->{nlinks} == 0 ) { $AttrNew->deleteInode($a->{inode}); $t->logWrite("copyInodes($dirName): $fileUM deleting inode $a->{inode} in new\n", 5); $DeltaNew->update($aInode->{compress}, $aInode->{digest}, -1); } else { $AttrNew->setInode($a->{inode}, $aInode); } $bpc->flushXSLibMesgs(); } } sub attribUpdate { my($t, $a, $f, $same) = @_; # # If the file was the same, we have to check the attributes to see if they # are the same too. If the file is newly written, we just write the # new attributes. # my $AttrNew = $t->{AttrNew}; my $AttrOld = $t->{AttrOld}; my $DeltaNew = $t->{DeltaNew}; my $DeltaOld = $t->{DeltaOld}; my $bpc = $t->{bpc}; my $attribSet = 1; my $newCompress = $t->{compress}; $newCompress = $a->{compress} if ( $a && defined($a->{compress}) ); $t->logWrite( sprintf( "File %s: old digest %s, new digest %s\n", $f->{name}, unpack("H*", $a->{digest}), unpack("H*", $f->{digest}) ), 5 ) if ( $a ); if ( $same && $a ) { if ( $a->{type} == $f->{type} && $a->{mode} == S_IMODE($f->{mode}) && $a->{uid} == $f->{uid} && $a->{gid} == $f->{gid} && $a->{size} == $f->{size} && $a->{mtime} == $f->{mtime} && $a->{digest} eq $f->{digest} ) { # # same contents, same attributes, so no need to rewrite # $attribSet = 0; } else { # # same contents, different attributes, so copy to old and # we will write the new attributes below # if ( $AttrOld && !$AttrOld->get($f->{name}) ) { if ( $AttrOld->set($f->{name}, $a, 1) ) { $DeltaOld->update($newCompress, $f->{digest}, 1); } } $f->{inode} = $a->{inode}; $f->{nlinks} = $a->{nlinks}; } } else { # # file is new or changed; update ref counts # $DeltaNew->update($newCompress, $f->{digest}, 1) if ( $f->{digest} ne "" ); } if ( $attribSet ) { my $newInode = $f->{inode}; $newInode = $t->{Inode}++ if ( !defined($newInode) ); my $nlinks = 0; $nlinks = $f->{nlinks} if ( defined($f->{nlinks}) ); $AttrNew->set( $f->{name}, { type => $f->{type}, mode => S_IMODE($f->{mode}), uid => $f->{uid}, gid => $f->{gid}, size => $f->{size}, mtime => $f->{mtime}, inode => $newInode, nlinks => $nlinks, compress => $newCompress, digest => $f->{digest}, } ); } $bpc->flushXSLibMesgs(); } # # Create the parent directory of $fullPath (if necessary). # If $noStrip != 0 then $fullPath is the directory to create, # rather than the parent. # sub pathCreate { my($t, $fullPath, $noStrip) = @_; # # Get parent directory of $fullPath # $t->logWrite("pathCreate: fullPath = $fullPath\n", 6); $fullPath =~ s{/[^/]*$}{} if ( !$noStrip ); return 0 if ( -d $fullPath ); unlink($fullPath) if ( -e $fullPath ); eval { mkpath($fullPath, 0, 0777) }; if ( $@ ) { $t->logWrite("Can't create $fullPath\n", 1); $t->{xferErrCnt}++; return -1; } return 0; } sub fileReadAll { my($t, $a, $f) = @_; return "" if ( $a->{size} == 0 ); my $f = BackupPC::XS::FileZIO::open($a->{poolPath}, 0, $a->{compress}); if ( !defined($f) ) { print("fileReadAll: Unable to open file $a->{poolPath} (for $f->{name})\n"); $t->{stats}{errCnt}++; return; } my $data; my $outData = ""; while ( $f->read(\$data, 65536) > 0 ) { $outData .= $data; } $f->close; return $outData; } 1; BackupPC-4.4.0/lib/BackupPC/Xfer/Tar.pm0000444000047500004750000002227113673511776016321 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Tar package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Tar class for managing # the tar-based transport of backup data from the client. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Tar; use strict; use Encode qw/from_to encode/; use base qw(BackupPC::Xfer::Protocol); use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK); use Errno qw(EWOULDBLOCK); sub useTar { return 1; } sub start { my($t) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my(@fileList, $tarClientCmd, $logMsg, $incrDate); local(*TAR); my $shareNamePath = $t->shareName2Path($t->{shareName}); if ( $t->{type} eq "restore" ) { $tarClientCmd = $conf->{TarClientRestoreCmd}; $logMsg = "restore started below directory $t->{shareName}"; # # restores are considered to work unless we see they fail # (opposite to backups...) # $t->{xferOK} = 1; } else { # # Turn $conf->{BackupFilesOnly} and $conf->{BackupFilesExclude} # into a hash of arrays of files, and $conf->{TarShareName} # to an array # $bpc->backupFileConfFix($conf, "TarShareName"); if ( defined($conf->{BackupFilesExclude}{$t->{shareName}}) ) { foreach my $file2 ( @{$conf->{BackupFilesExclude}{$t->{shareName}}} ) { my $file = $file2; $file = "./$2" if ( $file =~ m{^(\./+|/+)(.*)}s ); $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, "--exclude=$file"); } } if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) { foreach my $file2 ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) { my $file = $file2; $file = $2 if ( $file =~ m{^(\./+|/+)(.*)}s ); $file = "./$file"; $file = encode($conf->{ClientCharset}, $file) if ( $conf->{ClientCharset} ne "" ); push(@fileList, $file); } } else { push(@fileList, "."); } if ( ref($conf->{TarClientCmd}) eq "ARRAY" ) { $tarClientCmd = $conf->{TarClientCmd}; } else { $tarClientCmd = [split(/ +/, $conf->{TarClientCmd})]; } my $args; if ( $t->{type} eq "full" ) { $args = $conf->{TarFullArgs}; $logMsg = "full backup started for directory $t->{shareName}"; } else { $incrDate = $bpc->timeStamp($t->{incrBaseTime} - 3600, 1); $args = $conf->{TarIncrArgs}; $logMsg = "incr backup started back to $incrDate" . " (backup #$t->{incrBaseBkupNum}) for directory" . " $t->{shareName}"; } push(@$tarClientCmd, split(/ +/, $args)); } $logMsg .= " (client path $shareNamePath)" if ( $t->{shareName} ne $shareNamePath ); # # Merge variables into @tarClientCmd # my $args = { host => $t->{host}, hostIP => $t->{hostIP}, client => $t->{client}, incrDate => $incrDate, shareNameOrig => $t->{shareName}, shareName => $shareNamePath, fileList => \@fileList, tarPath => $conf->{TarClientPath}, sshPath => $conf->{SshPath}, }; from_to($args->{shareName}, "utf8", $conf->{ClientCharset}) if ( $conf->{ClientCharset} ne "" ); $tarClientCmd = $bpc->cmdVarSubstitute($tarClientCmd, $args); if ( !defined($t->{xferPid} = open(TAR, "-|")) ) { $t->{_errStr} = "Can't fork to run tar"; return; } $t->{pipeTar} = *TAR; if ( !$t->{xferPid} ) { # # This is the tar child. # setpgrp 0, 0; if ( $t->{type} eq "restore" ) { # # For restores, close the write end of the pipe, # clone STDIN to RH # close($t->{pipeWH}); close(STDERR); open(STDERR, ">&STDOUT"); close(STDIN); open(STDIN, "<&$t->{pipeRH}"); } else { # # For backups, close the read end of the pipe, # clone STDOUT to WH, and STDERR to STDOUT # close($t->{pipeRH}); close(STDERR); open(STDERR, ">&STDOUT"); open(STDOUT, ">&$t->{pipeWH}"); } # # Run the tar command # alarm(0); $bpc->cmdExecOrEval($tarClientCmd, $args); # should not be reached, but just in case... $t->{_errStr} = "Can't exec @$tarClientCmd"; return; } my $str = $bpc->execCmd2ShellCmd(@$tarClientCmd); from_to($str, $conf->{ClientCharset}, "utf8") if ( $conf->{ClientCharset} ne "" ); $t->{XferLOG}->write(\"Running: $str\n"); alarm($conf->{ClientTimeout}); $t->{_errStr} = undef; # # make pipeTar non-blocking; BackupPC_dump uses select() to see if there # is something to read. # if ( !fcntl($t->{pipeTar}, F_SETFL, fcntl($t->{pipeTar}, F_GETFL, 0) | O_NONBLOCK) ) { $t->{_errStr} = "can't set pipeTar to non-blocking"; } return $logMsg; } sub readOutput { my($t, $FDreadRef, $rout) = @_; my $conf = $t->{conf}; if ( vec($rout, fileno($t->{pipeTar}), 1) ) { my $mesg; $! = 0; if ( sysread($t->{pipeTar}, $mesg, 8192) <= 0 ) { if ( $! == EWOULDBLOCK ) { $t->{XferLOG}->write(\"readOutput: no bytes read (EWOULDBLOCK); continuing\n"); } elsif ( eof($t->{pipeTar}) ) { $t->{XferLOG}->write(\"readOutput: sysread returns 0 and got EOF\n"); vec($$FDreadRef, fileno($t->{pipeTar}), 1) = 0; if ( !close($t->{pipeTar}) && $? != 256 ) { # # Tar 1.16 uses exit status 1 (256) when some files # changed during archive creation. We allow this # as a benign error and consider the archive ok # $t->{tarOut} .= "Tar exited with error $? ($!) status\n"; $t->{xferOK} = 0 if ( !$t->{tarBadExitOk} ); } } } else { $t->{tarOut} .= $mesg; } } my $logFileThres = $t->{type} eq "restore" ? 1 : 2; while ( $t->{tarOut} =~ /(.*?)[\n\r]+(.*)/s ) { $_ = $1; $t->{tarOut} = $2; from_to($_, $conf->{ClientCharset}, "utf8") if ( $conf->{ClientCharset} ne "" ); # # refresh our inactivity alarm # alarm($conf->{ClientTimeout}) if ( !$t->{abort} ); $t->{lastOutputLine} = $_ if ( !/^$/ ); if ( /^Total bytes (written|read): / ) { $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 1 ); $t->{xferOK} = 1; } elsif ( /^(a )?\./ ) { $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= $logFileThres ); $t->{fileCnt}++; } else { # # Ignore annoying log message on incremental for tar 1.15.x # if ( !/: file is unchanged; not dumped$/ && !/: socket ignored$/ ) { $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 ); $t->{xferErrCnt}++; } # # If tar encounters a minor error, it will exit with a non-zero # status. We still consider that ok. Remember if tar prints # this message indicating a non-fatal error. # $t->{tarBadExitOk} = 1 if ( $t->{xferOK} && /Error exit delayed from previous / ); # # Also remember files that had read errors # if ( /: \.\/(.*): Read error at byte / ) { my $badFile = $1; push( @{$t->{badFiles}}, { share => $t->{shareName}, file => $badFile } ); } } } return 1; } sub setSelectMask { my($t, $FDreadRef) = @_; vec($$FDreadRef, fileno($t->{pipeTar}), 1) = 1; } 1; BackupPC-4.4.0/lib/BackupPC/Xfer/Archive.pm0000444000047500004750000000577113673511776017162 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer::Archive package # # DESCRIPTION # # This library defines a BackupPC::Xfer::Archive class for managing # archives to media. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer::Archive; use strict; use base qw(BackupPC::Xfer::Protocol); sub start { return "Archive Started"; } sub run { my($t) = @_; my $bpc = $t->{bpc}; my $conf = $t->{conf}; my(@HostList, @BackupList, $archiveClientCmd, $archiveClientCmd2, $logMsg); $archiveClientCmd = $conf->{ArchiveClientCmd}; $t->{xferOK} = 1; @HostList = $t->{HostList}; @BackupList = $t->{BackupList}; my $i = 0; my $tarCreatePath = "$conf->{InstallDir}/bin/BackupPC_tarCreate"; while ( ${@HostList[0]}[$i] ) { # # Merge variables into @archiveClientCmd # my $errStr; my $cmdargs = { archiveloc => $t->{archiveloc}, parfile => $t->{parfile}, compression => $t->{compression}, compext => $t->{compext}, splitsize => $t->{splitsize}, host => ${@HostList[0]}[$i], backupnumber => ${@BackupList[0]}[$i], Installdir => $conf->{InstallDir}, tarCreatePath => $tarCreatePath, splitpath => $conf->{SplitPath}, parpath => $conf->{ParPath}, }; $archiveClientCmd2 = $bpc->cmdVarSubstitute($archiveClientCmd, $cmdargs); $t->{XferLOG}->write(\"Executing: @$archiveClientCmd2\n"); $bpc->cmdSystemOrEvalLong( $archiveClientCmd2, sub { $errStr = $_[0]; $t->{XferLOG}->write(\$_[0]); }, 0, $t->{pidHandler} ); if ( $? ) { ($t->{_errStr} = $errStr) =~ s/[\n\r]+//; return; } $i++; } $t->{XferLOG}->write(\"Completed Archive\n"); return "Completed Archive"; } 1; BackupPC-4.4.0/lib/BackupPC/Lang/0000755000047500004750000000000013673511776015210 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/Lang/ja.pm0000444000047500004750000017163213673511776016150 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "アーカイブ開始"; $Lang{Stop_Dequeue_Archive} = "ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–åœæ­¢/デキュー"; $Lang{Start_Full_Backup} = "フルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–‹å§‹"; $Lang{Start_Incr_Backup} = "増分ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–‹å§‹"; $Lang{Stop_Dequeue_Backup} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—åœæ­¢/デキュー"; $Lang{Restore} = "リストア"; $Lang{Type_full} = "フル"; $Lang{Type_incr} = "インクリメンタル"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "管ç†è€…ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯æ¨©é™ãŒã‚るユーザã®ã¿è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"; $Lang{H_Admin_Options} = "BackupPCサーãƒ: 管ç†è€…オプション"; $Lang{Admin_Options} = "管ç†è€…オプション"; $Lang{Admin_Options_Page} = < \${h2("サーãƒç®¡ç†")}
サーãƒè¨­å®šã®å†èª­è¾¼:
EOF $Lang{Unable_to_connect_to_BackupPC_server} = "BackupPCサーãƒã¸æŽ¥ç¶šã§ãã¾ã›ã‚“"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < エラー内容: \$err.
BackupPCãŒèµ·å‹•ã—ã¦ã„ãªã„ã‹ã€è¨­å®šã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹ã¨æ€ã‚れã¾ã™ã€‚ 本件をシステム管ç†è€…ã¸å ±å‘Šã—ã¦ãã ã•ã„。 EOF $Lang{Admin_Start_Server} = < ホスト\$Conf{ServerHost} ãƒãƒ¼ãƒˆ\$Conf{ServerPort} ã®BackupPCサーãƒã¯èµ·å‹•ã—ã¦ã„ã¾ã›ã‚“(ã¡ã‚‡ã†ã©åœæ­¢ã—ã¦ã„ã‚‹ã‹ã€ã¾ã èµ·å‹•ã—ã¦ã„ãªã„ã¨æ€ã‚れã¾ã™)。
é–‹å§‹ã—ã¾ã™ã‹ï¼Ÿ EOF # ----- $Lang{H_BackupPC_Server_Status} = "BackupPCサーãƒã®çŠ¶æ…‹"; $Lang{BackupPC_Server_Status_General_Info} = <
  • サーãƒã®PID㯠\$Info{pid} ã§ã™ã€‚ \$Conf{ServerHost} ホスト上ã§å‹•作ã—ã¦ã„ã¾ã™ã€‚ ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ \$Info{Version}〠\$serverStartTime ã«é–‹å§‹ã—ã¦ã„ã¾ã™ã€‚
  • ã“ã®ã‚µãƒ¼ãƒçŠ¶æ…‹ã¯ \$now ç¾åœ¨ã®ã‚‚ã®ã§ã™ã€‚
  • 最後ã«è¨­å®šãŒèª­ã¿è¾¼ã¾ã‚ŒãŸã®ã¯ \$configLoadTime ã§ã™ã€‚
  • 次ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã¯ \$nextWakeupTime ã®äºˆå®šã§ã™ã€‚
  • ä»–ã®æƒ…å ±:
    • 最後ã«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã•れãŸèµ·å‹•ã‹ã‚‰ä¿ç•™ä¸­ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¦æ±‚: \$numBgQueue
    • ä¿ç•™ä¸­ã®ãƒ¦ãƒ¼ã‚¶ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¦æ±‚: \$numUserQueue
    • ä¿ç•™ä¸­ã®ã‚³ãƒžãƒ³ãƒ‰è¦æ±‚: \$numCmdQueue \$poolInfo
    • プールファイルシステム㯠\$Info{DUlastValue}% (\$DUlastTime ç¾åœ¨)ã€ä»Šæ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUDailyMax}% (\$DUmaxTime)ã€ æ˜¨æ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUDailyMaxPrev}%。
    • Inode プールファイルシステム㯠\$Info{DUInodelastValue}% (\$DUlastTime ç¾åœ¨)ã€ä»Šæ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUInodeDailyMax}% (\$DUInodemaxTime)ã€ æ˜¨æ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUInodeDailyMaxPrev}%。
    EOF $Lang{BackupPC_Server_Status} = < \${h2("ç¾åœ¨å®Ÿè¡Œä¸­ã®ã‚¸ãƒ§ãƒ–")}

    \$jobStr
    ホスト 種別 ユーザ 開始時間 コマンド PID è»¢é€ PID Status Count

    \$generalInfo \${h2("注æ„ã™ã‚‹å¿…è¦ãŒã‚る失敗")}

    \$statusStr
    ホスト 種別 ユーザ 最終試行 詳細 エラー時刻 最終エラー (無応答以外)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: ホストサマリ"; $Lang{BackupPC__Archive} = "BackupPC: アーカイブ"; $Lang{BackupPC_Summary} = <

    • ã“ã®è¡¨ç¤ºå†…容㯠\$now ã«æ›´æ–°ã•れãŸã‚‚ã®ã§ã™ã€‚
    • プールファイルシステム㯠\$Info{DUlastValue}% (\$DUlastTime ç¾åœ¨)ã€ä»Šæ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUDailyMax}% (\$DUmaxTime)ã€ æ˜¨æ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUDailyMaxPrev}%。
    • Inode プールファイルシステム㯠\$Info{DUInodelastValue}% (\$DUlastTime ç¾åœ¨)ã€ä»Šæ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUInodeDailyMax}% (\$DUInodemaxTime)ã€ æ˜¨æ—¥ã®æœ€å¤§å€¤ã¯ \$Info{DUInodeDailyMaxPrev}%。

    \${h2("ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå­˜åœ¨ã™ã‚‹ãƒ›ã‚¹ãƒˆ")}

    \$hostCntGood 個ã®ãƒ›ã‚¹ãƒˆã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå­˜åœ¨ã—ã¾ã™ã€‚

    • \$fullTot 個ã®ãƒ•ルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®åˆè¨ˆã‚µã‚¤ã‚º \${fullSizeTot}GiB (以å‰ã®ãƒ—ーリングã¨åœ§ç¸®)
    • \$incrTot 個ã®å¢—分ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®åˆè¨ˆã‚µã‚¤ã‚º \${incrSizeTot}GiB (以å‰ã®ãƒ—ーリングã¨åœ§ç¸®)

    \$strGood
    ホスト ユーザ コメント フル フル世代 (日数) フルサイズ (GiB) 速度(MB/s) 増分 å¢—åˆ†çµŒéŽ (日数) 最終ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— (日数) 状態 #転é€ã‚¨ãƒ©ãƒ¼ 最終試行
    \${h2("ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå­˜åœ¨ã—ãªã„ホスト")}

    \$hostCntNone 個ã®ãƒ›ã‚¹ãƒˆã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå­˜åœ¨ã—ã¾ã›ã‚“。

    \$strNone
    ホスト ユーザ コメント フル フル世代(æ—¥) フルサイズ(GiB) 速度(MB/s) #増分 増分(æ—¥) 最終ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—(æ—¥) 状態 #転é€ã‚¨ãƒ©ãƒ¼ 最終試行
    EOF $Lang{BackupPC_Archive} = < \$hostCntGood ホストã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—済ã®åˆè¨ˆã‚µã‚¤ã‚º \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    ホスト ユーザ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—サイズ

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Archive Location/Device EOF $Lang{BackupPC_Archive2_compression} = < 圧縮 ãªã—
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < パリティデータã®å‰²åˆ (0 = 無効, 5 = 一般) EOF $Lang{BackupPC_Archive2_split} = < 出力を次ã¸åˆ†é›¢ Mãƒã‚¤ãƒˆ EOF # ----------------------------------- $Lang{Pool_Stat} = <プール㯠\$info->{"\${name}FileCnt"}ファイル㨠\$info->{"\${name}DirCnt"}ディレクトリ(\$poolTime 時点)ã‚’å«ã‚€ã€\${poolSize}GiBã®ã‚µã‚¤ã‚ºãŒã‚りã¾ã™ã€‚
  • プールã®ãƒãƒƒã‚·ãƒ³ã‚°ã¯æœ€é•· \$info->{"\${name}FileRepMax"} ã® \$info->{"\${name}FileCntRep"} ã®ç¹°ã‚Šè¿”ã™ãƒ•ァイルをæä¾›ã—ã¾ã™ã€‚
  • \$poolTime ã®å¤œé–“ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã«ã‚ˆã£ã¦åˆè¨ˆ\${poolRmSize}GiBã® \$info->{"\${name}FileCntRm"} 個ã®ãƒ•ァイル㌠削除ã•れã¾ã—ãŸã€‚ EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: \$host ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¦æ±‚"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < サーãƒã‹ã‚‰ã®è¿”ä¿¡: \$reply

    \$host ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã¸æˆ»ã‚‹. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–‹å§‹ã®ç¢ºèª \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < \$host ã® \$type ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’é–‹å§‹ã—ã¾ã™ã€‚

    本当ã«å®Ÿè¡Œã—ã¦ã‚ˆã„ã§ã™ã‹ï¼Ÿ
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—åœæ­¢ã®ç¢ºèª \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < \$host ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ä¸­æ­¢/デキューをã—ã¾ã™ã€‚
    ãªãŠã€ 時間ã€ä»–ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’é–‹å§‹ã—ãªã„ã§ãã ã•ã„。

    本当ã«å®Ÿè¡Œã—ã¦ã‚ˆã„ã§ã™ã‹ï¼Ÿ

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "権é™ãŒã‚るユーザã®ã¿ã‚­ãƒ¥ãƒ¼ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚"; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "権é™ãŒã‚るユーザã®ã¿ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: キューサマリ"; # -------------------------------- $Lang{Backup_Queue_Summary} = < ç¾åœ¨ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¦ã„ã‚‹ãƒ¦ãƒ¼ã‚¶è¦æ±‚ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚

    \$strUser
    ホスト Action è¦æ±‚時間 ユーザ
    \${h2("ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚­ãƒ¥ãƒ¼ã‚µãƒžãƒª")}

    ç¾åœ¨ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¦ã„ã‚‹ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰è¦æ±‚ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚

    \$strBg
    ホスト Action è¦æ±‚時間 ユーザ
    \${h2("コマンドキューサマリ")}

    ç¾åœ¨ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¦ã„ã‚‹ã‚³ãƒžãƒ³ãƒ‰è¦æ±‚ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚

    \$strCmd
    ホスト Action è¦æ±‚時間 ユーザ コマンド
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: ファイル \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$fileã®å†…容 \$mtimeStr æ›´æ–° \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ \$skipped 行スキップã—ã¾ã—ãŸã€‚ ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \n\$file ログファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“。\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: ログファイルã®å±¥æ­´";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    ファイル サイズ 更新時間
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    å—信者 ホスト 日時 ä»¶å
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: \$host \$num ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®é–²è¦§"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: \$host リストアオプション"; $Lang{Restore_Options_for__host2} = < 共有 \$share ã‹ã‚‰æ¬¡ã®ãƒ•ァイル/ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ã„ã¾ã™ã€‚ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· #\$num:
      \$fileListStr

    ã“れらファイル/ディレクトリã®ãƒªã‚¹ãƒˆã‚¢æ–¹æ³•を3ã¤ã®ä¸­ã‹ã‚‰é¸ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ 次ã®ä¸­ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。

    \${h2("オプション1: ダイレクトリストア")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHostã¸ç›´æŽ¥ã“れらã®ãƒ•ァイルをリストアã—ã¾ã™ã€‚

    警告: 既存ã®ãƒ•ァイルã¯é¸æŠžã—ãŸã“れらã®ãƒ•ァイルã§ä¸Šæ›¸ãã•れã¾ã™ã€‚

    \$hiddenStr
    ホストã¸ãƒ•ァイルをリストア
    共有ã¸ãƒ•ァイルをリストア
    次ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ãƒ•ァイルをリストア
    (共有ã¸ã®ç›¸å¯¾)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("オプション2: Zipアーカイブã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰")}

    é¸æŠžã—ãŸãƒ•ァイル/ディレクトリをã™ã¹ã¦å«ã‚“ã ZIPアーカイブをダウンロードã—ã¾ã™ã€‚ WinZipã®ã‚ˆã†ãªãƒ­ãƒ¼ã‚«ãƒ«ã‚¢ãƒ—リケーションã§é–²è¦§ã—ãŸã‚Šå±•é–‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

    警告: depending upon which files/directories you have selected, this archive might be very very large. It might take many minutes to create and transfer the archive, and you will need enough local disk space to store it.

    \$hiddenStr Make archive relative to \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (otherwise archive will contain full paths).
    圧縮 (0=ãªã—, 1=高速,...,9=最高)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("オプション2: ZIPアーカイブã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰")}

    Archive::Zip ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã®ã§ZIPアーカイブをダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 www.cpan.orgã‹ã‚‰Archive::Zipをインストールã™ã‚‹ã“ã¨ã«ã¤ã„ã¦ã€ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < You can download a Tar archive containing all the files/directories you have selected. You can then use a local application, such as tar or WinZip to view or extract any of the files.

    Warning: depending upon which files/directories you have selected, this archive might be very very large. It might take many minutes to create and transfer the archive, and you will need enough local disk space to store it.

    \$hiddenStr Make archive relative to \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (otherwise archive will contain full paths).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: \$host リストアã®ç¢ºèª"; $Lang{Are_you_sure} = < You are about to start a restore directly to the machine \$In{hostDest}. The following files will be restored to share \$In{shareDest}, from ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· \$num:

    \$fileListStr
    å…ƒã®ãƒ•ァイル/ディレクトリ次ã®å ´æ‰€ã«ãƒªã‚¹ãƒˆã‚¢ã•れã¾ã™ã€‚

    \$hiddenStr 本当ã«å®Ÿè¡Œã—ã¦ã‚ˆã„ã§ã™ã‹ï¼Ÿ
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: \$hostDest ã¸ãƒªã‚¹ãƒˆã‚¢"; $Lang{Reply_from_server_was___reply} = < サーãƒã‹ã‚‰ã®å¿œç­”: \$reply

    \$hostDest ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã«æˆ»ã‚‹ EOF $Lang{BackupPC_Archive_Reply_from_server} = < サーãƒã‹ã‚‰ã®å¿œç­”: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: ホスト \$host ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—サマリ"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("ãƒ¦ãƒ¼ã‚¶ã®æ“作")}

    \$startIncrStr

    \${h2("ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—サマリ")}

    閲覧・ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルã®ãƒªã‚¹ãƒˆã‚¢ã‚’行ã„ãŸã„ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—番å·ã‚’クリックã—ã¦ãã ã•ã„。

    \$deleteHdrStr \$str
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· ç¨®åˆ¥ フィルド レベル 開始日時 é–“éš”(分) 経éŽ(æ—¥) ä¿ã¤ コメント

    \$restoreStr

    \${h2("転é€ã‚¨ãƒ©ãƒ¼ã‚µãƒžãƒª")} \$errStr
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· ç¨®åˆ¥ ビュー #転é€ã‚¨ãƒ©ãƒ¼ #badファイル #bad共有 #tarエラー
    \${h2("ファイルサイズ/カウント å†åˆ©ç”¨ã‚µãƒžãƒª")}

    存在ã™ã‚‹ãƒ•ァイルã¯ãƒ—ール内ã«ã™ã§ã«ã‚りã¾ã™ã€‚æ¬¡ã®æ–°ã—ã„ファイルã¯ãƒ—ールã¸è¿½åŠ ã•れã¾ã™ã€‚ 空ファイルã¨SMBエラーã¯å†åˆ©ç”¨ã«ã¯ã‚«ã‚¦ãƒ³ãƒˆã•れã¾ã›ã‚“。

    \$sizeStr
    トータル 既存ファイル 新ファイル
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· ç¨®åˆ¥ #ファイル サイズ(MB) 速度(MB/sec) #ファイル サイズ(MB) #ファイル サイズ(MB)
    \${h2("圧縮サマリ")}

    ã™ã§ã«ãƒ—ールã«å…¥ã£ã¦ã„ã‚‹ã‚‚ã®ã¨æ–°ã—ã圧縮ã•れãŸãƒ•ァイルã®åœ§ç¸®ãƒ‘フォーマンス

    \$compStr
    既存ファイル 新ファイル
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· ç¨®åˆ¥ 圧縮レベル サイズ(MB) 圧縮(MB) 圧縮 サイズ(MB) 圧縮(MB) 圧縮
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: ホスト \$host アーカイブサマリ"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("ユーザæ“作")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: エラー"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "サーãƒ"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • \$backupTime ã«é–‹å§‹ã—ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— #\$num (\$backupAge æ—¥å‰) を閲覧ã—ã¦ã„ã¾ã™ã€‚ \$filledBackup
    • ディレクトリを入力ã—ã¦ãã ã•ã„:
    • コメント:
    • 移動ã—ãŸã„ディレクトリを左下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„
    • リストアã™ã‚‹ãƒ•ァイルをå³ä¸‹ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„
    • ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—履歴を見るã“ã¨ãŒã§ãã¾ã™ã€‚ \$share2pathStr
    \${h2("\$dirDisplay ã®å†…容")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < 共有åã®å®Ÿéš›ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ‘スã¸ã®ãƒžãƒƒãƒ”ング (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: \$host ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—履歴ディレクトリ"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < å…¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’ã¾ãŸã„ã§ãƒ•ァイルã®ãれãžã‚Œã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã—ã¾ã™ã€‚
    • ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—番å·ã‚’クリックã™ã‚‹ã“ã¨ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—閲覧画é¢ã«æˆ»ã‚Šã¾ã™ã€‚
    • ディレクトリリンク(\$Lang->{DirHistory_dirLink})をクリックã™ã‚‹ã“ã¨ã§ã€ ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã«ç§»å‹•ã§ãã¾ã™ã€‚
    • ファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒªãƒ³ã‚¯(\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...)をクリックã™ã‚‹ã“ã¨ã§ã€ãã®ãƒ•ァイルをダウンロードã§ãã¾ã™ã€‚
    • ç•°ãªã‚‹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–“ã®åŒã˜å†…容ã®ãƒ•ァイルã¯åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã«ãªã‚Šã¾ã™ã€‚(PleaseTranslateThis: except between v3 and v4 backups)
    • ãã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã«å­˜åœ¨ã—ãªã„ファイルやディレクトリã«ã¤ã„ã¦ã¯ç©ºæ¬„ã«ãªã‚Šã¾ã™ã€‚
    • åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ•ァイルã§ã‚‚ç•°ãªã‚‹å±žæ€§ã‚’æŒã£ã¦ã„ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ ファイルã®å±žæ€§ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—番å·ã‚’é¸æŠžã™ã‚‹ã¨è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
    \${h2("\$dirDisplay ã®å±¥æ­´")}
    \$backupNumStr\$backupTimeStr \$fileStr
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—番å·
    ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—日時
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: リストア #\$num 詳細 \$host"; $Lang{Restore___num_details_for__host2} = <
    ç•ªå· \$Restores[\$i]{num}
    è¦æ±‚å…ƒ \$RestoreReq{user}
    è¦æ±‚時間 \$reqTime
    çµæžœ \$Restores[\$i]{result}
    エラーメッセージ \$Restores[\$i]{errorMsg}
    元ホスト \$RestoreReq{hostSrc}
    å…ƒãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ç•ªå· \$RestoreReq{num}
    元共有 \$RestoreReq{shareSrc}
    リストア先 \$RestoreReq{hostDest}
    共有先 \$RestoreReq{shareDest}
    開始日時 \$startTime
    é–“éš” \$duration min
    ファイル数 \$Restores[\$i]{nFiles}
    åˆè¨ˆã‚µã‚¤ã‚º \${MB} MB
    転é€çއ \$MBperSec MB/sec
    Tar作æˆã‚¨ãƒ©ãƒ¼ \$Restores[\$i]{tarCreateErrs}
    転é€ã‚¨ãƒ©ãƒ¼ \$Restores[\$i]{xferErrs}
    転é€ãƒ­ã‚°ãƒ•ァイル ビュー, エラー

    \${h1("ファイル/ディレクトリ一覧")}

    \$fileListStr
    å…ƒã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª/ファイルリストア
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: アーカイブ #\$num 詳細 \$host"; $Lang{Archive___num_details_for__host2} = <
    ç•ªå· \$Archives[\$i]{num}
    è¦æ±‚å…ƒ \$ArchiveReq{user}
    è¦æ±‚時間 \$reqTime
    çµæžœ \$Archives[\$i]{result}
    エラーメッセージ \$Archives[\$i]{errorMsg}
    開始日時 \$startTime
    é–“éš” \$duration min
    転é€ãƒ­ã‚°ãƒ•ァイル ビュー, エラー

    \${h1("ホスト一覧")}

    \$HostListStr
    ホストãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—番å·
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: メールサマリ"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: check apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Wrong user: my userid is \$>, instead of \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Only privileged users can view PC summaries."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Only privileged users can stop or start backups on \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "ç•ªå· \${EscHTML(\$In{num})} ãŒä¸æ­£ã§ã™ã€‚"; $Lang{Unable_to_open__file__configuration_problem} = "Unable to open \$file: configuration problem?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Only privileged users can view log or config files."; $Lang{Only_privileged_users_can_view_log_files} = "Only privileged users can view log files."; $Lang{Only_privileged_users_can_view_email_summaries} = "Only privileged users can view email summaries."; $Lang{Only_privileged_users_can_browse_backup_files} = "Only privileged users can browse backup files ホスト \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "ホストåãŒç©ºã§ã™ã€‚"; $Lang{Directory___EscHTML} = "ディレクトリ \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} ã¯ç©ºã§ã™ã€‚"; $Lang{Can_t_browse_bad_directory_name2} = "Can\'t browse bad directory name \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Only privileged users can restore backup files for host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "\${EscHTML(\$host)} ã¯ãƒ›ã‚¹ãƒˆåãŒèª¤ã£ã¦ã„ã¾ã™ã€‚"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "ä½•ã‚‚ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ã„ã¾ã›ã‚“。戻ã£ã¦ã„ãã¤ã‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。"; $Lang{You_haven_t_selected_any_hosts} = "ä½•ã‚‚ãƒ›ã‚¹ãƒˆã‚’é¸æŠžã—ã¦ã„ã¾ã›ã‚“。戻ã£ã¦ã„ãã¤ã‹ã®ãƒ›ã‚¹ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。"; $Lang{Nice_try__but_you_can_t_put} = "Nice try, but you can\'t put \'..\' in any of the file names"; $Lang{Host__doesn_t_exist} = "Host \${EscHTML(\$In{hostDest})} doesn\'t exist"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "You don\'t have permission to restore onto host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Can\'t open/create \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Only privileged users can restore backup files for host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "ホストåãŒç©ºã§ã™ã€‚"; $Lang{Unknown_host_or_user} = "Unknown host or user \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Only privileged users can view information about host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Only privileged users can view archive information."; $Lang{Only_privileged_users_can_view_restore_information} = "Only privileged users can view restore information."; $Lang{Restore_number__num_for_host__does_not_exist} = "Restore number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archive number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Can_t_find_IP_address_for} = "Can\'t find IP address for \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Until I see \$host at a particular DHCP address, you can only start this request from the client machine itself. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¦æ±‚ on DHCP \$host (\$In{hostIP}) by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "\$User ã«ã‚ˆã‚‹ \$host ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¦æ±‚"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "\$User ã«ã‚ˆã‚‹ \$host ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中止/デキュー"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "ホスト\$hostDest ã®ãƒªã‚¹ãƒˆã‚¢è¦æ±‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— #\$num, by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "\$ENV{REMOTE_ADDR} ã‹ã‚‰ \$User ã«ã‚ˆã£ã¦ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®è¦æ±‚ãŒã‚りã¾ã—ãŸã€‚"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "状態"; $Lang{PC_Summary} = "ホストサマリ"; $Lang{LOG_file} = "ログファイル"; $Lang{LOG_files} = "全ログファイル"; $Lang{Old_LOGs} = "旧ログ"; $Lang{Email_summary} = "メールサマリ"; $Lang{Config_file} = "設定ファイル"; # $Lang{Hosts_file} = "ホストファイル"; $Lang{Current_queues} = "ç¾åœ¨ã®ã‚­ãƒ¥ãƒ¼"; $Lang{Documentation} = "文章"; #$Lang{Host_or_User_name} = "ホストã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶å:"; $Lang{Go} = "実行"; $Lang{Hosts} = "ホスト"; $Lang{Select_a_host} = "ãƒ›ã‚¹ãƒˆã‚’é¸æŠž"; $Lang{There_have_been_no_archives} = "

    アーカイブã¯ã‚りã¾ã›ã‚“

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    ã“ã®PCã¯ã¾ã ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•れãŸã“ã¨ãŒã‚りã¾ã›ã‚“!!

    \n"; $Lang{This_PC_is_used_by} = "
  • ã“ã®PC㯠\${UserLink(\$user)} ã«ã‚ˆã£ã¦ä½¿ç”¨ã•れã¦ã„ã¾ã™"; $Lang{Extracting_only_Errors} = "(エラーã ã‘抽出)"; $Lang{XferLOG} = "転é€ãƒ­ã‚°"; $Lang{Errors} = "エラー"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <最後ã®ãƒ¡ãƒ¼ãƒ«ã¯ \$mailTime ã«ä»¶å"\$subj"ã§\${UserLink(\$user)}å®›ã«é€ã‚Šã¾ã—ãŸã€‚ EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <\$startTime ã«é–‹å§‹ã•れãŸã‚³ãƒžãƒ³ãƒ‰ \$cmd ã¯ç¾åœ¨ \$host ã§ã¯å®Ÿè¡Œã•れã¦ã„ã¾ã›ã‚“。 EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <ホスト \$host ã¯ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚­ãƒ¥ãƒ¼ã«ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¾ã—ãŸ(ã‚‚ã†å°‘ã—ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•れã¾ã™)。 EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <ホスト \$host ã¯ãƒ¦ãƒ¼ã‚¶ã‚­ãƒ¥ãƒ¼ã«ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¾ã—ãŸ(ã‚‚ã†å°‘ã—ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•れã¾ã™)。 EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <\$host ã¸ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れã¾ã—ãŸ(ã‚‚ã†å°‘ã—ã§å®Ÿè¡Œã•れã¾ã™)。 EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <最終状態 \"\$Lang->{\$StatusHost{state}}\"\$reason \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <最終エラー \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <\$StatusHost{deadCnt}回連続㧠\$host ã¯ç„¡å¿œç­”ã§ã™ã€‚ EOF # ----- $Lang{Prior_to_that__pings} = "pingã®ä»¥å‰ã¯"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$host ã¸ã®\$priorStr 㯠\$StatusHost{aliveCnt}å›žé€£ç¶šã§æˆåŠŸã—ã¦ã„ã¾ã™ã€‚ EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <\$host ã¯å°‘ãªãã¨ã‚‚ \$Conf{BlackoutGoodCnt} 回連続ã—ã¦ã€ \$blackoutStr ã‹ã‚‰ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•れã¦ã„ã¾ã›ã‚“。 EOF $Lang{__time0_to__time1_on__days} = "\$days ã® \$t0 〜 \$t1"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Backups are deferred for \$hours hours (change this number). EOF $Lang{tryIP} = " 㨠\$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "ホスト \$In{host}"; $Lang{checkAll} = <  å…¨é¸æŠž EOF $Lang{checkAllHosts} = <  å…¨é¸æŠž EOF $Lang{fileHeader} = < åå‰ ç¨®åˆ¥ モード # サイズ 更新日時 EOF $Lang{Home} = "ホーム"; $Lang{Browse} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®é–²è¦§"; $Lang{Last_bad_XferLOG} = "最終失敗転é€ãƒ­ã‚°"; $Lang{Last_bad_XferLOG_errors_only} = "最終失敗転é€ãƒ­ã‚°(エラーã®ã¿)"; $Lang{This_display_is_merged_with_backup} = <ã“ã®è¡¨ç¤ºã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— #\$numF ã¨ãƒžãƒ¼ã‚¸ã•れã¦ã„ã¾ã™ã€‚ EOF $Lang{Visit_this_directory_in_backup} = < 閲覧ã—ãŸã„ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„: EOF $Lang{Restore_Summary} = < 詳細を閲覧ã—ãŸã„リストア番å·ã‚’クリックã—ã¦ãã ã•ã„。 \$restoreStr
    ãƒªã‚¹ãƒˆã‚¢ç•ªå· çµæžœ 開始日時 é–“éš”(分) ファイル数 サイズ(MB) #tarエラー #転é€ã‚¨ãƒ©ãƒ¼

    EOF $Lang{Archive_Summary} = < アーカイブ番å·ã‚’クリックã™ã‚‹ã¨è©³ç´°ãŒç¢ºèªã§ãã¾ã™ã€‚ \$ArchiveStr
    ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ç•ªå· çµæžœ 開始日時 é–“éš”(分)

    EOF $Lang{BackupPC__Documentation} = "BackupPC: 文章"; $Lang{No} = "ã„ã„ãˆ"; $Lang{Yes} = "ã¯ã„"; $Lang{The_directory_is_empty} = <\$dirDisplay ディレクトリã¯ç©ºã§ã™ã€‚ EOF #$Lang{on} = "オン"; $Lang{off} = "オフ"; $Lang{backupType_full} = "フル"; $Lang{backupType_incr} = "増分"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "部分"; $Lang{failed} = "失敗"; $Lang{success} = "æˆåŠŸ"; $Lang{and} = "ã¨"; # ------ # Hosts states and reasons $Lang{Status_idle} = "待機"; $Lang{Status_backup_starting} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–‹å§‹"; $Lang{Status_backup_in_progress} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中"; $Lang{Status_restore_starting} = "リストア開始"; $Lang{Status_restore_in_progress} = "リストア中"; $Lang{Status_admin_pending} = "リンクä¿ç•™ä¸­"; $Lang{Status_admin_running} = "リンク実行中"; $Lang{Reason_backup_done} = "完了"; $Lang{Reason_restore_done} = "リストア完了"; $Lang{Reason_archive_done} = "アーカイブ完了"; $Lang{Reason_nothing_to_do} = "待機"; $Lang{Reason_backup_failed} = "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—失敗"; $Lang{Reason_restore_failed} = "リストア失敗"; $Lang{Reason_archive_failed} = "アーカイブ失敗"; $Lang{Reason_no_ping} = "無応答"; $Lang{Reason_backup_canceled_by_user} = "ユーザã«ã‚ˆã‚‹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å–æ¶ˆ"; $Lang{Reason_restore_canceled_by_user} = "ユーザã«ã‚ˆã‚‹ãƒªã‚¹ãƒˆã‚¢å–消"; $Lang{Reason_archive_canceled_by_user} = "ユーザã«ã‚ˆã‚‹ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å–æ¶ˆ"; $Lang{Disabled_OnlyManualBackups} = "自動無効化"; $Lang{Disabled_AllBackupsDisabled} = "無効化"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: \$host ã®æˆåŠŸã—ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå­˜åœ¨ã—ã¾ã›ã‚“。"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has never been successfully backed up by our PC backup software. PC backups should occur automatically when your PC is connected to the network. You should contact computer support if: - Your PC has been regularly connected to the network, meaning there is some configuration or setup problem preventing backups from occurring. - You don't want your PC backed up and you want these email messages to stop. Otherwise, please make sure your PC is connected to the network next time you are in the office. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: no recent backups on \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has not been successfully backed up for $days days. Your PC has been correctly backed up $numBackups times from $firstTime to $days days ago. PC backups should occur automatically when your PC is connected to the network. If your PC has been connected for more than a few hours to the network during the last $days days you should contact IS to find out why backups are not working. Otherwise, if you are out of the office, there's not much you can do, other than manually copying especially critical files to other media. You should be aware that any files you have created or changed in the last $days days (including all new email and attachments) cannot be restored if your PC disk crashes. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlook files on \$host need to be backed up"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "not been backed up successfully"; $Lang{howLong_not_been_backed_up_for_days_days} = "not been backed up for \$days days"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPCサーãƒ"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < 備考: ã“ã®ãƒ›ã‚¹ãƒˆç‰¹æœ‰ã®å€¤ã«æ›´æ–°ã—ãŸã„å ´åˆã¯ã€ã€Œä¸Šæ›¸ãã€ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。

    EOF $Lang{CfgEdit_Button_Save} = "ä¿å­˜"; $Lang{CfgEdit_Button_Insert} = "挿入"; $Lang{CfgEdit_Button_Delete} = "削除"; $Lang{CfgEdit_Button_Add} = "追加"; $Lang{CfgEdit_Button_Override} = "上書ã"; $Lang{CfgEdit_Button_New_Key} = "æ–°é …ç›®"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "エラー: エラーã®ãŸã‚ã«ä¿å­˜ã•れã¦ã¾ã›ã‚“"; $Lang{CfgEdit_Error__must_be_an_integer} = "エラー: \$var ã¯æ•´æ•°ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "エラー: \$var ã¯å®Ÿåœ¨ã™ã‚‹ç•ªå·ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "エラー: \$var エントリー \$k ã¯æ•´æ•°ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "エラー: \$var エントリー \$k ã¯å®Ÿåœ¨ã™ã‚‹ç•ªå·ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error__must_be_executable_program} = "エラー: \$var ã¯æœ‰åйãªå®Ÿè¡Œå¯èƒ½ãªãƒ‘スã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error__must_be_valid_option} = "エラー: \$var ã¯æœ‰åйãªã‚ªãƒ—ションã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "\$copyHost ã®ã‚³ãƒ”ーãŒå­˜åœ¨ã—ã¾ã›ã‚“。 creating full host name \$fullHost. Delete this host if that is not what you wanted."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User copied config from host \$fromHost to \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User deleted \$p from \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User added \$p to \$conf, set to \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User changed \$p in \$conf to \$valueNew from \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User deleted host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host changed \$key from \$valueOld to \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User added host \$host: \$value\n"; #end of lang_ja.pm BackupPC-4.4.0/lib/BackupPC/Lang/cz.pm0000444000047500004750000016337213673511776016174 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Spustit Archivaci"; $Lang{Stop_Dequeue_Archive} = "UkonÄit/Odstranit z Fronty Archivaci"; $Lang{Start_Full_Backup} = "Spustit Úplné Zálohování"; $Lang{Start_Incr_Backup} = "Spustit InkremetaÄní Zálohování"; $Lang{Stop_Dequeue_Backup} = "UkonÄit/Odstranit z Fronty Zálohování"; $Lang{Restore} = "Obnovit"; $Lang{Type_full} = "úplný"; $Lang{Type_incr} = "inkrementaÄní"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Pouze oprávnÄ›ní uživatelé mají přístup k administraÄnímu nastavení."; $Lang{H_Admin_Options} = "BackupPC Server: AdministraÄní nastavení"; $Lang{Admin_Options} = "AdministraÄní nastavení"; $Lang{Admin_Options_Page} = < \${h2("Kontrola Serveru")}

    Znovu nahrát konfiguraci serveru:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Není možné se připojit k BackupPC serveru"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < Chyba: \$err.
    Je možné, že BackupPC server není spuÅŸtÄ›n nebo je chyba v konfiguraci. Prosím oznamte to systémovému administrátorovi. EOF $Lang{Admin_Start_Server} = < BackupPC server na \$Conf{ServerHost} port \$Conf{ServerPort} není momentálnÄ› spuÅŸtÄ›n (možná jste ho ukonÄil nebo jeÅŸtÄ› nespustil).
    Chceste ho spustit? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Status Serveru BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • PID serveru je \$Info{pid}, na hostu \$Conf{ServerHost}, verze \$Info{Version}, spuÅŸtÄ›ný \$serverStartTime.
  • Vygenerování stavu : \$now.
  • Nahrání konfigurace : \$configLoadTime.
  • PC bude příştÄ› ve frontÄ› : \$nextWakeupTime.
  • Dalşí informace:
    • \$numBgQueue nevyřízených žádostí o zálohu z posledního naplánované probuzení,
    • \$numUserQueue nevyřízených žádostí o zálohu od uživatelů,
    • \$numCmdQueue pending command requests, \$poolInfo
    • Stav úložiÅŸtÄ› je \$Info{DUlastValue}% (\$DUlastTime), dneÅŸní maximum je \$Info{DUDailyMax}% (\$DUmaxTime) a vÄerejşí maximum bylo \$Info{DUDailyMaxPrev}%.
    • Inode stav úložiÅŸtÄ› je \$Info{DUInodelastValue}% (\$DUlastTime), dneÅŸní maximum je \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) a vÄerejşí maximum bylo \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Probíhající úlohy")}

    \$jobStr
    Host Typ Uživatel Spuştěno Příkaz PID Xfer PID Status Count

    \$generalInfo \${h2("Selhání, která vyžadují pozornost")}

    \$statusStr
    Host Typ Uživatel Poslední pokus Detaily Čas chyby Poslední chyba (jiná než žádný ping)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Výpis Hostů"; $Lang{BackupPC__Archive} = "BackupPC: Archiv"; $Lang{BackupPC_Summary} = <

    • Tento stav byl vygenerován v \$now.
    • Stav úložiÅŸtÄ› je \$Info{DUlastValue}% (\$DUlastTime), dneÅŸní maximum je \$Info{DUDailyMax}% (\$DUmaxTime) a vÄerejşí maximum bylo \$Info{DUDailyMaxPrev}%.
    • Inode stav úložiÅŸtÄ› je \$Info{DUInodelastValue}% (\$DUlastTime), dneÅŸní maximum je \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) a vÄerejşí maximum bylo \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hosté s úspěşně provedenými zálohami")}

    \$hostCntGood hostů bylo úspěşně zálohováno, v celkové velikost:

    • \$fullTot úplných záloh v celkové velitosti \${fullSizeTot}GiB (pÅ™ed kompresí),
    • \$incrTot inkementaÄních záloh v celkové velikosti \${incrSizeTot}GiB (pÅ™ed kompresí).

    \$strGood
    Host Uživatel Poznámka #Plný Plný ÄŒas (dní) Plný Velikost (GiB) Rychlost (MB/s) #Inkr Inkr Äas (dní) Poslední Záloha (dní) Stav #Xfer chyb Poslední pokus
    \${h2("Hosté s žádnými provedenými zálohami")}

    \$hostCntNone hostů s žádnými zálohani.

    \$strNone
    Host Uživatel Poznámka #Plný Plný ÄŒas (dní) Plný Velikost (GiB) Rychlost (MB/s) #Inkr Inkr Äas (dní) Poslední Záloha (dní) Stav #Xfer chyb Poslední pokus
    EOF $Lang{BackupPC_Archive} = < \$hostCntGood hostů, kteří byli zálohováni v celkové velikosti \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host Uživatel Velikost zálohy

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Umístění Archivu EOF $Lang{BackupPC_Archive2_compression} = < Komprese None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Procent paritních dat (0 = vypnuté, 5 = typické) EOF $Lang{BackupPC_Archive2_split} = < Rozdělit výstup na Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <V úložişti je \${poolSize}GiB zahrnujíc \$info->{"\${name}FileCnt"} souborů a \$info->{"\${name}DirCnt"} adresářů (od \$poolTime),
  • Hashování úložiÅŸtÄ› dává \$info->{"\${name}FileCntRep"} opakujících se souborů s nejdelşím Å™etÄ›zem \$info->{"\${name}FileRepMax"},
  • NoÄní úklid úložiÅŸtÄ› odstranil \$info->{"\${name}FileCntRm"} souborů velikosti \${poolRmSize}GiB (kolem \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Záloha vyžádána na \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < OdpovÄ›Ä serveru na: \$reply

    Vra se na domovskou stránku \$host. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: ZaÄátek zálohy potvrzen na \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Chystáte se spustit \$type zálohu na \$host.

    Opravdu to chcete provést?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: UkonÄit potvrzení kopie na \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Chystáte se ukonÄit/vyÅ™adit z fronty zálohování na \$host;
    Prosím, nezaÄínejte jiné zálohování hodin.

    Opravdu to chcete provést?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Pouze oprávnění uživatelé mají přistup k frontám."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Pouze oprávnění uživatelé mohou archivovat."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Přehled front"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Následující uživatelé jsou momentálně ve frontě:

    \$strUser
    Host Action Čas do Uživatel
    \${h2("Souhrn fronty v pozadí")}

    Následující žádosti v pozadí jsou momentálně ve frontě:

    \$strBg
    Host Action Čas do Uživatel
    \${h2("Souhrn fronty příkazů")}

    Následující příkazy jsou momentálně ve frontě:

    \$strCmd
    Host Action Čas do Uživatel Příkaz
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Soubor \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, modifikován \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ pÅ™eskoÄeno \$skipped řádků ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nNení možné otevřít log soubor \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Historie Log Souboru";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Soubor Velikost ÄŒas modifikace
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Příjemce Odesílatel Čas Předmět
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Prohlížet zálohu \$num pro \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Obnovit nastavení pro \$host"; $Lang{Restore_Options_for__host2} = < Vybral jste následující soubory/adresáře z Äásti \$share, záloha Äíslo #\$num:
      \$fileListStr

    Pro obnovení těchto souborů/adresářů máte tři možnosti. Vyberte si, prosím, jednu z následujících možností.

    \${h2("Možnost 1: Přímá obnova")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Varování: jakýkoliv existující soubor, který odpovída těm, které máte vybrány bude smazán!

    \$hiddenStr
    Obnovit souboru do hosta
    Obnovení souborů do Äásti
    Obnovit soubory v adresáři
    (vztahující se k Äásti)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Možnost 2: Stáhnout Zip archiv")}

    Můžete stáhnout Zip archiv obsahující vşechny soubory/adresáře, které jste vybral. Poté můžete použít aplikaci, např. WinZip, k zobrazení nebp rozbalení některého z těchto souborů.

    Varování: v závislosti na tom, které soubory/adresáře jste vybral, tento archiv může být velmi velký. Vytvoření a přenos archivu může trvat minuty, a budete potřebovat dostatek místa na lokálním disku.

    \$hiddenStr Vytvořit archiv relativní k \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (jinak bude archiv obsahovat plnou cestu).
    Komprese (0=off, 1=rychlá,...,9=nejlepşí)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Možnost 2: Stánout Zip archiv")}

    Archive::Zip není nainstalován, Äili nebude možné stáhnout zip archiv. Požádejte systémového administrátora o instalaci Archive::Zip z www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Můžete stáhnout Tar archiv obsahující vşechny soubory/adresáře, které jste vybral. Poté můžete použít aplikaci, např. tar nebo WinZip, k zobrazení nebp rozbalení některého z těchto souborů.

    Varování: v závislosti na tom, které soubory/adresáře jste vybral, tento archiv může být velmi velký. Vytvoření a přenos archivu může trvat minuty, a budete potřebovat dostatek místa na lokálním disku.

    \$hiddenStr Vytvoř archiv relativní k \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (jinak bude archiv obsahovat plnou cestu).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Potvrzení obnovení na \$host"; $Lang{Are_you_sure} = < Chystáte se zahájit obnovu přímo do poÄítaÄe \$In{hostDest}. Následující soubory budou obnoveny do Äásti \$In{shareDest}, ze zálohy Äíslo \$num:

    \$fileListStr
    Originální soubor/adresářBude obnoven do

    \$hiddenStr Obravdu to chceş provést?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Obnovit vyžádané na \$hostDest"; $Lang{Reply_from_server_was___reply} = < OdpovÄ›Ä od serveru: \$reply

    Jít zpÄ›t na domovská stránka \$hostDest. EOF $Lang{BackupPC_Archive_Reply_from_server} = < OdpovÄ›Ä od serveru: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Přehled záloh hosta \$host"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("User Actions")}

    \$startIncrStr

    \${h2("Přehled záloh")}

    KliknÄ›te na Äíslo zálohy pro prohlížení a obnovení zálohy.

    \$deleteHdrStr \$str
    Backup# Typ Vyplněno Úroveň Datum spuştění Doba trvání/minuty Doba/dny Držet Komentář

    \$restoreStr

    \${h2("Přehled Xfer chyb")} \$errStr
    Backup# Typ Pohled #Xfer chyby #ÅŸpatné soubory #ÅŸpatné Äásti #tar chyby
    \${h2("File Size/Count Reuse Summary")}

    Existující soubory jsou ty, které jsou již v úložiÅŸti; nové jsou pÅ™idané do úložiÅŸtÄ›. Prázné soubory a SMB chyby nejsou poÄítány.

    \$sizeStr
    Celkově Existující soubory Nové soubory
    Záloha # Typ #Soubory Velikost/MB MB/sec #Soubory Velikost/MB #Soubory Velikost/MB
    \${h2("Přehled kompresí")}

    Výkon komprese pro soubory, které jsou již v úložişti a pro nově zkomprimované soubory.

    \$compStr
    Existující soubory Nové soubory
    Záloha # Typ Úroveň komprese Velikost/MB Komprese/MB Komprese Velikost/MB Komprese/MB Komprese
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Přehled archivů hosta \$host "; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Uživatelské akce")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Chyba"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Server"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Prohlížíte zálohu #\$num, která byla spuÅŸtÄ›na kolem \$backupTime (\$backupAge dní zpÄ›t), \$filledBackup
    • Zadej adresář:
    • Komentář:
    • Klikni na adresář níže a pokraÄuj do nÄ›j,
    • Klikni na soubor níže a obnov ho,
    • MůžeÅŸ vidÄ›t zálohu history aktuálního adresáře. \$share2pathStr
    \${h2("Obsah \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mapování názvu sdílené položky na skuteÄnou cestu klienta (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Historie záloh adresářů pro \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "adres"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Tato obrazovka zobrazuje každou unikátní verzi souboru ze vşech záloh:
    • Klikni na Äíslo zálohy k návratu do prohlížeÄe záloh,
    • Klikni na odkaz adresáře (\$Lang->{DirHistory_dirLink}) k pÅ™echodu do nÄ›j,
    • Klikni na odkaz verze souboru (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) k jeho stažení,
    • Soubory se stejným obsahem v různých zálohách mají stejné Äíslo verze (PleaseTranslateThis: except between v3 and v4 backups),
    • Soubory nebo adresáře, které nejsou ve vybrané záloze nejsou oznaÄeny.
    • Soubory zobrazené se stejným Äíslem verze mohou mít rozdílné atributy. Vyber Äíslo zálohy k zobrazení atributů souboru.
    \${h2("Historie \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Číslo zálohy
    Čas zálohy
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Obnovit #\$num detailů pro \$host"; $Lang{Restore___num_details_for__host2} = <
    Číslo \$Restores[\$i]{num}
    Vyžádal \$RestoreReq{user}
    Čas vyžádání \$reqTime
    Výsledek \$Restores[\$i]{result}
    Chybová zpráva \$Restores[\$i]{errorMsg}
    Zdrojový host \$RestoreReq{hostSrc}
    Číslo zdrojové zálohy \$RestoreReq{num}
    Zdrojová Äást \$RestoreReq{shareSrc}
    Cílový host \$RestoreReq{hostDest}
    Cílová Äást \$RestoreReq{shareDest}
    Čas spuştění \$startTime
    Doba trvání \$duration min
    PoÄet souborů \$Restores[\$i]{nFiles}
    Celková velikost \${MB} MB
    Přenosová rychlost \$MBperSec MB/sec
    TarCreate chyb \$Restores[\$i]{tarCreateErrs}
    Xfer chyb \$Restores[\$i]{xferErrs}
    Xfer log soubor View, Errors

    \${h1("Seznam souborů/adresářů")}

    \$fileListStr
    Originální soubor/adresářObnoven do
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Archivovat #\$num detailů pro \$host"; $Lang{Archive___num_details_for__host2} = <
    Číslo \$Archives[\$i]{num}
    Vyžádal \$ArchiveReq{user}
    Čas vyžádání \$reqTime
    Odpověd \$Archives[\$i]{result}
    Chybová zpráva \$Archives[\$i]{errorMsg}
    Čas spustění \$startTime
    Dpba trvání \$duration min
    Xfer log soubor View, Errors

    \${h1("Seznam hostů")}

    \$HostListStr
    HostČíslo kopie
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Souhrn emailů"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: zkontroluj apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Åžpatný uživatel: moje userid je \$>, místo \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Pouze oprávnÄ›ní uživatelé jsou oprávnÄ›ni prohlížet souhrny PC."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Pouze oprávnÄ›ní uživatelé mohou ukonÄit nebo spustit zálohování na \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Åžpatné Äíslo \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "NepodaÅ™ilo se otevřít \$file: problém konfigurace?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Pouze oprávnÄ›ní uživatelé mají přístup k log a konfiguraÄním souborům."; $Lang{Only_privileged_users_can_view_log_files} = "Pouze oprávnÄ›ní uživatelé mají přístup k log souborům."; $Lang{Only_privileged_users_can_view_email_summaries} = "Pouze oprávnÄ›ní uživatelé mají přístup k souhrnu emailů."; $Lang{Only_privileged_users_can_browse_backup_files} = "Pouze oprávnÄ›ní uživatelé mohou prohlížet soubory záloh pro host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Prázdné jméno hosta."; $Lang{Directory___EscHTML} = "Adresář \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} je prázdný"; $Lang{Can_t_browse_bad_directory_name2} = "Není možné prohlížet - ÅŸpatný název adresáře \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Pouze oprávnÄ›ní uživatelé mohou obnovovat soubory zálohy pro hosta \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Åžpatné jméno hosta \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Nevybral jste žádný soubor; prosím jdÄ›te ZpÄ›t k výbÄ›ru souborů."; $Lang{You_haven_t_selected_any_hosts} = "Nevybral jste žádného hosta; prosím jdÄ›te ZpÄ›t k výbÄ›ru hostů."; $Lang{Nice_try__but_you_can_t_put} = "Nelze umístit \'..\' do názvu souboru"; $Lang{Host__doesn_t_exist} = "Host \${EscHTML(\$In{hostDest})} neexistuje"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Nemáte oprávnÄ›ní k obnovÄ› na \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Nelze otevřít nebo vytvoÅ™it \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Pouze oprávnÄ›ní uživatelé mohou obnovovat soubory zálohy pro hosta \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Prázdné jméno hosta"; $Lang{Unknown_host_or_user} = "Neznámý host nebo uživatel \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Pouze oprávnÄ›ní uživatelé mají přístup k informacím o hostu \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Pouze oprávnÄ›ní uživatelé mají přístup k informacím o archivaci."; $Lang{Only_privileged_users_can_view_restore_information} = "Pouze oprávnÄ›ní uživatelé mají přístup k informacím o obnovÄ›."; $Lang{Restore_number__num_for_host__does_not_exist} = "Číslo obnovení \$num pro hosta \${EscHTML(\$host)} neexsituje."; $Lang{Archive_number__num_for_host__does_not_exist} = "Číslo archivu \$num pro hosta \${EscHTML(\$host)} neexsituje."; $Lang{Can_t_find_IP_address_for} = "Nelze nalézt IP adresu pro \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Dokud nebude vidÄ›t \$host na vybrané DHCP adrese, můžete pouze spustit žádost z přímo klientského zařízení. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Záloha vyžádána z DHCP \$host (\$In{hostIP}) uživatelem \$User z \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Záloha vyžádána z \$host uživatelem \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Záloha ukonÄena/vyÅ™azena z fronty z \$host uživatelem \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Obnova vyžádána na hosta \$hostDest, obnova #\$num, uživatelem \$User z \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivace vyžádána uživatelem \$User z \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Stav"; $Lang{PC_Summary} = "Souhrn hostů"; $Lang{LOG_file} = "LOG soubor"; $Lang{LOG_files} = "LOG soubory"; $Lang{Old_LOGs} = "Staré LOGy"; $Lang{Email_summary} = "Souhrn emailů"; $Lang{Config_file} = "KonfiguraÄní soubor"; # $Lang{Hosts_file} = "Hosts soubor"; $Lang{Current_queues} = "Aktuální fronty"; $Lang{Documentation} = "Dokumentace"; #$Lang{Host_or_User_name} = "Jméno uživatele nebo hosta:"; $Lang{Go} = "Jdi"; $Lang{Hosts} = "Hosts"; $Lang{Select_a_host} = "Vyber hosta..."; $Lang{There_have_been_no_archives} = "

    Nebyli žádné archivy

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Toto PC nebylo nikdy zálohováno!!

    \n"; $Lang{This_PC_is_used_by} = "
  • Toto PC je používáno uživatelem \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Rozbalování chyb)"; $Lang{XferLOG} = "XferLOG"; $Lang{Errors} = "Chyby"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Poslední email odeslán uživately \${UserLink(\$user)} byl v \$mailTime, pÅ™edmÄ›t "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Příkaz \$cmd je aktuálnÄ› vykonáván pro \$host, spuÅŸtÄ›n v \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Host \$host Äeká ve frontÄ› na pozadí (bude brzy zálohován). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Host \$host Äeká ve frontÄ› uživatelů (bude brzy zálohován). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Příkaz pro \$host Äeká ve frontÄ› příkazů (bude brzy spuÅŸtÄ›n). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Poslední stav \"\$Lang->{\$StatusHost{state}}\"\$reason v Äase \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <Poslední chyba je \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Pingy na \$host selhaly \$StatusHost{deadCnt} za sebou. EOF # ----- $Lang{Prior_to_that__pings} = "PÅ™edchozí pingy"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr na \$host byli úspěşné \$StatusHost{aliveCnt} za sebou. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Protože \$host byl na síti alespoň \$Conf{BlackoutGoodCnt} za sebou, nebude zálohován z \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 on \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Zálohy byli odloženy na \$hours hodin (zmÄ›n toto Äíslo). EOF $Lang{tryIP} = " a \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Select all EOF $Lang{checkAllHosts} = <  Select all EOF $Lang{fileHeader} = < Jméno Typ Mód # Velikost Datum zmÄ›ny EOF $Lang{Home} = "Doma"; $Lang{Browse} = "Prohlížení záloh"; $Lang{Last_bad_XferLOG} = "Poslední ÅŸpatný XferLOG"; $Lang{Last_bad_XferLOG_errors_only} = "Poslední ÅŸpatný XferLOG (chyb pouze)"; $Lang{This_display_is_merged_with_backup} = < Toto zobrazení je slouÄeno se zálohou #\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Vyberte zálohu, kterou si pÅ™ejete zobrazit: EOF $Lang{Restore_Summary} = < Klikni na obnovení pro více detailů. \$restoreStr
    Obnovení # Výsledek Datum spuştení Doba trvání/minuty #souborů MB #tar chyb #xferErrs

    EOF $Lang{Archive_Summary} = < Klikni na Äíslo archivu pro více detailů. \$ArchiveStr
    Archiv# Výsledek Datum spuştení Doba trvání/minuty

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentace"; $Lang{No} = "ne"; $Lang{Yes} = "ano"; $Lang{The_directory_is_empty} = <Adresář \$dirDisplay je prázdný EOF #$Lang{on} = "zapnout"; $Lang{off} = "vypnout"; $Lang{backupType_full} = "plný"; $Lang{backupType_incr} = "inkr"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "ÄásteÄný"; $Lang{failed} = "neúspěşný"; $Lang{success} = "úspěşný"; $Lang{and} = "a"; # ------ # Hosts states and reasons $Lang{Status_idle} = "neÄinný"; $Lang{Status_backup_starting} = "záloha se spouÅŸtí"; $Lang{Status_backup_in_progress} = "záloha probíhá"; $Lang{Status_restore_starting} = "obnovení se spouÅŸtí"; $Lang{Status_restore_in_progress} = "obnovení probíhá"; $Lang{Status_admin_pending} = "link Äeká"; $Lang{Status_admin_running} = "link běží"; $Lang{Reason_backup_done} = "hotovo"; $Lang{Reason_restore_done} = "obnovení dokonÄeno"; $Lang{Reason_archive_done} = "archivace dokonÄena"; $Lang{Reason_nothing_to_do} = "neÄinný"; $Lang{Reason_backup_failed} = "zálohování selhalo"; $Lang{Reason_restore_failed} = "obnovení selhalo"; $Lang{Reason_archive_failed} = "archivace selhala"; $Lang{Reason_no_ping} = "žádný ping"; $Lang{Reason_backup_canceled_by_user} = "zálohování zruÅŸeno uživatelem"; $Lang{Reason_restore_canceled_by_user} = "obnovení zruÅŸeno uživatelem"; $Lang{Reason_archive_canceled_by_user} = "archivace zruÅŸena uživatelem"; $Lang{Disabled_OnlyManualBackups} = "automatické zálohování zakázáno"; $Lang{Disabled_AllBackupsDisabled} = "zakázáno"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: žadné zálohy hosta \$host se nezdaÅ™ili"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: PÅ™edmÄ›t: $subj $headers Dear $userName, VaÅŸe PC ($host) nebylo nikdy úspěşnÄ› zálohováno naşím zálohovacím softwarem. Zálohování PC by mÄ›lo být spuÅŸtÄ›no automaticky, když je VaÅŸe PC pÅ™ipojeno do sítÄ›. Mel by jste kontaktovat VaÅŸi podporu pokud: - VaÅŸe PC bylo pravidelnÄ› pÅ™ipojováno do sítÄ›, zÅ™ejmÄ› je nÄ›jaký probém v nastavení nebo konfiguraci, který zabraňuje zálohování. - Nechcete VaÅŸe PC zálohovat a chcete pÅ™estat dostávat tyto zprávy. UjistÄ›te se, že je VaÅŸe PC pÅ™ipojeno do sítÄ›, až budete příştÄ› v kanceláři. S pozdravem, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: žádné nové zálohy pro \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: PÅ™edmÄ›t: $subj $headers Drahý $userName, VaÅŸe PC ($host) nebylo úspěşnÄ› zálohovýno již $days dní. VaÅŸe PC bylo korektnÄ› zálohováno $numBackups krát od $firstTime do dne pÅ™ed $days dny. Zálohování PC by se mÄ›lo spustit automaticky, když je VaÅŸe PC pÅ™ipojeno do sítÄ›. Pokud bylo VaÅŸe PC pÅ™ipojeno do sítÄ› více než nÄ›kolik hodin v průbÄ›hu posledních $days dní, mÄ›l by jste kontaktovat VaÅŸi podporu k zjiÅŸtÄ›ní, proÄ zálohování nefunguje. Pokud jste mimo kancelář, nemůžete udÄ›lat nic jiného než zkopírovat kritické soubory na jiná media. MÄ›l by jste mít na pamÄ›ti, že vÅŸechny soubory vytvoÅ™ené nebo zmÄ›nÄ›né v posledních $days dnech (i s vÅŸemi novými emaily a přílohami) nebudou moci býti obnoveny, pokud se disk ve VaÅŸem poÄítaÄi poÅŸkodí. S pozdravem, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Soubory programu Outlook na \$host je nutné zálohovat"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: PÅ™edmÄ›t: $subj $headers Drahý $userName, Soubory programu Outlook na VaÅŸem PC mají $howLong. Tyto soubory obsahují vÅŸechny VaÅŸe emaily, přílohy, kontakty a informace v kalendáři. VaÅŸe PC bylo naposled korektnÄ› zálohováno $numBackups krát od $firstTime do $lastTime. NicménÄ› Outlook zamkne vÅŸechny svoje soubory když je spuÅŸtÄ›n a znemožňuje jejich zálohování. DoporuÄujeme Vám zálohovat soubory Outlooku, když jste pÅ™ipojen do sítÄ› tak, že ukonÄíte program Outlook a vÅŸechny ostatní aplikace a ve vaÅŸem prohlížeÄi otevÅ™ete tuto adresu: $CgiURL?host=$host Vyberte "Spustit inkrementaÄní zálohování" dvakrát ke spuÅŸtení nového zálohování. Můžete vybrat "Návrat na $host page" a poté stiknout "obnovit" ke zjiÅŸtÄ›ní stavu zálohování. DokonÄení může trvat nÄ›kolik minut. S pozdravem, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "nebylo zálohováno úspěşnÄ›"; $Lang{howLong_not_been_backed_up_for_days_days} = "nebylo zálohováno \$days dní"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS kanál BackupPC"; $Lang{RSS_Host_Summary} = < Poznámka: oznaÄte PÅ™epsat, pokud chcete modifikovat hodnotu specifickou pro tohoto hosta.

    EOF $Lang{CfgEdit_Button_Save} = "Uložit"; $Lang{CfgEdit_Button_Insert} = "Vložit"; $Lang{CfgEdit_Button_Delete} = "Smazat"; $Lang{CfgEdit_Button_Add} = "PÅ™idat"; $Lang{CfgEdit_Button_Override} = "PÅ™epsat"; $Lang{CfgEdit_Button_New_Key} = "Nový klíÄ"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Chyba: Neuloženo z důvody chyb"; $Lang{CfgEdit_Error__must_be_an_integer} = "Chyba: \$var musí být celé Äíslo"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Chyba: \$var musí být reálné Äíslo"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Chyba: vstup \$var \$k musí být celé Äíslo"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Chyba: vstup \$var \$k musí být reálné Äíslo"; $Lang{CfgEdit_Error__must_be_executable_program} = "Chyba: \$var musí být správná cesta"; $Lang{CfgEdit_Error__must_be_valid_option} = "Chyba: \$var musí být správná možnost"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Kopie hosta \$copyHost neexistuje; vytvářím nový název hosta \$fullHost. Smažte tohota hosta, pokud to není to, co jste chtÄ›l."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User zkopíroval konfiguraci z hosta \$fromHost do \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User smazal \$p z \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User pÅ™idal \$p do \$conf, nastavil na \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User zmÄ›nil \$p v \$conf do \$valueNew z \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User smazal hosta \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host zmÄ›nil \$key z \$valueOld na \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User pÅ™idal host \$host: \$value\n"; #end of lang_cz.pm BackupPC-4.4.0/lib/BackupPC/Lang/it.pm0000444000047500004750000017007313673511776016170 0ustar craigcraig#!/usr/bin/perl # # Italian i18n file # # (C) Lorenzo Cappelletti 2004 # Added translations and corrections: # Giuseppe Iuculano 2006 # Vittorio Macchi 2006 # # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Avvia archivio"; $Lang{Stop_Dequeue_Archive} = "Arresta/disaccoda archivio"; $Lang{Start_Full_Backup} = "Avvia backup completo"; $Lang{Start_Incr_Backup} = "Avvia backup incrementale"; $Lang{Stop_Dequeue_Backup} = "Arresta/disaccoda backup"; $Lang{Restore} = "Ripristina"; $Lang{Type_full} = "completo"; $Lang{Type_incr} = "incrementale"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Solo gli utenti privilegiati possono visualizzare le opzioni di amministrazione."; $Lang{H_Admin_Options} = "Server BackupPC: opzioni di amministrazione"; $Lang{Admin_Options} = "Opzioni di amministrazione"; $Lang{Admin_Options_Page} = < \${h2("Controllo server")}

    Ricarica la configurazione del server:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Impossibile connettersi al server BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < L'errore è: \$err.
    Forse il server BackupPC non è in esecuzione o c'è un errore nella configurazione. Contattare l'amministratore di sistema. EOF $Lang{Admin_Start_Server} = < Il server BackupPC presso \$Conf{ServerHost} sulla porta \$Conf{ServerPort} non è attualmente in esecuzione (forse è stato arrestato oppure non è stato ancora avviato).
    Si desidera avviarlo? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Stato server BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • Il PID del server è \$Info{pid} sull\'host \$Conf{ServerHost}, versione \$Info{Version}, avviato il \$serverStartTime.
  • Questo rapporto di stato è stato generato il \$now.
  • La configurazione è stata caricata l'ultima volte il \$configLoadTime.
  • Il prossimo accodamento dei PC sarà effettuato il \$nextWakeupTime.
  • Altre informazioni:
    • \$numBgQueue richieste pendenti di backup dall\'ultimo risveglio programmato
    • \$numUserQueue richieste pendenti di backup da parte degli utenti
    • \$numCmdQueue richieste pendenti di comandi \$poolInfo
    • Recentemente il sistema dei file di pool è stato al \$Info{DUlastValue}% (\$DUlastTime). Il massimo di oggi è del \$Info{DUDailyMax}% (\$DUmaxTime), mentre quello di ieri era del \$Info{DUDailyMaxPrev}%.
    • Inode recentemente il sistema dei file di pool è stato al \$Info{DUInodelastValue}% (\$DUlastTime). Il massimo di oggi è del \$Info{DUInodeDailyMax}% (\$DUInodemaxTime), mentre quello di ieri era del \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Processi attualmente in esecuzione")}

    \$jobStr
    Host Tipo Utente Data inizio Comando PID PID Xfer Status Count

    \$generalInfo \${h2("Fallimenti che richiedono attenzione")}

    \$statusStr
    Host Tipo Utente Ultimo tentativo Dettagli Data errore Ultimo errore (diverso da ping)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: prospetto host"; $Lang{BackupPC__Archive} = "BackupPC: Archive"; $Lang{BackupPC_Summary} = <

    • Questo rapporto di stato è stato generato il \$now.
    • Recentemente il sistema dei file di pool è stato al \$Info{DUlastValue}% (\$DUlastTime). Il massimo di oggi è del \$Info{DUDailyMax}% (\$DUmaxTime), mentre quello di ieri era del \$Info{DUDailyMaxPrev}%.
    • Inode recentemente il sistema dei file di pool è stato al \$Info{DUInodelastValue}% (\$DUlastTime). Il massimo di oggi è del \$Info{DUInodeDailyMax}% (\$DUInodemaxTime), mentre quello di ieri era del \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Host con backup validi")}

    Ci sono \$hostCntGood host sottoposti a backup per un totale di:

    • \$fullTot backup completi per una dimensione totale di \${fullSizeTot}GiB (prima del processo di pooling e compressione),
    • \$incrTot backup incrementali per una dimensione totale di \${incrSizeTot}GiB (prima del processo di pooling e compressione).

    \$strGood
    Host Utente Commento Completi Età completi (giorni) Dimensione completi (GiB) Velocità (MB/s) Incrementali Età incrementali (giorni) Ultimo Backup (giorni) Stato Numero errori trasferimento Ultimo tentativo
    \${h2("Host senza backup")}

    Ci sono \$hostCntNone host senza alcun backup.

    \$strNone
    Host Utente Commento Completi Età completi (giorni) Dimensione completi (GiB) Velocità (MB/s) Incrementali Età incrementali (giorni) Ultimo Backup (giorni) Stato Numero errori trasferimento Ultimo tentativo
    EOF $Lang{BackupPC_Archive} = < È stato effettuato il backup di \$hostCntGood host per una dimensione totale di \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host Utente Dimensione backup

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Localizzazione archivio/dispositivi EOF $Lang{BackupPC_Archive2_compression} = < Compressione nessuna
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Percentuale di dati di parit� (0 = disabiltata, 5 = valori tipici) EOF $Lang{BackupPC_Archive2_split} = < Suddividi output in Megabyte EOF # ----------------------------------- $Lang{Pool_Stat} = <Il pool di \${poolSize}GiB comprende \$info->{"\${name}FileCnt"} file e \$info->{"\${name}DirCnt"} directory (al \$poolTime),
  • L\'hash del pool dà \$info->{"\${name}FileCntRep"} file ripetuti con la catena più lunga di \$info->{"\${name}FileRepMax"},
  • La pulizia notturna ha rimosso \$info->{"\${name}FileCntRm"} file per una dimensione di \${poolRmSize}GiB (circa il \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: richiesta di backup per \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < La risposta del server è stata: \$reply

    Ritorna alla homepage di \$host. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: conferma avvio backup per \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Si sta per avviare un backup \$type per \$host.

    Avviare veramente?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Conferma di arresto backup per \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Si sta per arrestare/disaccodare i backup per \$host;
    Inoltre, non avviare ulteriori backup per ora/e.

    Arrestare veramente?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Solo gli utenti con privilegi possono visualizzare la coda."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Solo gli utenti privilegiati possono archiviare."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Prospetto coda"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Sono state accodate le seguenti richieste degli utenti:

    \$strUser
    Host Action Data richiesta Utente
    \${h2("Prospetto code in background")}

    Sono attualmente in coda le seguenti richieste di background:

    \$strBg
    Host Action Data richiesta Utente
    \${h2("Prospetto coda comandi")}

    Sono attualmente in coda le seguenti richieste di comandi:

    \$strCmd
    Host Action Data richiesta Utente Comando
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: file \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file modificato il \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ saltate \$skipped righe ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nImpossibile aprire il file di log \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: cronologia file di log";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    File Dimensione Data modifica
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Destinatario Host Data Oggetto
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Sfoglia backup \$num per \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Opzioni di ripristino per \$host"; $Lang{Restore_Options_for__host2} = < Sono state selezionate i seguenti file/directory dalla condivisione \$share, backup numero \$num:
      \$fileListStr

    Sono disponibili tre scelte per il ripristino di questi file/directory. Selezionare una delle opzioni seguenti.

    \${h2("Opzione 1: ripristino diretto")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Attenzione: ogni file esistente che corrisponde ai file selezionati sarà sovrascritto!

    \$hiddenStr
    Ripristino dei file sull\'host
    Ripristino dei file sulla condivisione
    Ripristino dei file al di sotto della directory (relativa alla condivisione)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Opzione 2: scaricamento archivio zip")}

    È possibile scaricare un archivio zip contenente tutti i file/directory selezionati. Sarà poi possibile usare un applicativo locale, come WinZip, per visualizzare o estrarre un file qualsiasi.

    Attenzione: a seconda dei file/directory selezionati, l\'archivio potrebbe essere molto grande. La creazione ed il trasferimento dell\'archivio potrebbe richiedere diversi minuti e sarà necessario disporre di abbastanza spazio sul proprio disco rigido locale per poterlo contenere.

    \$hiddenStr Creare l\'archivio relativamente a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (altrimenti l\'archivio conterrà percorsi completi).
    Compressione (0=spenta, 1=veloce,...,9=migliore)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Opzione 2: scaricamento archivio zip")}

    Archive::Zip non è installato e non è quindi possibile scaricare un archivio zip. Contattare l\'amministratore di sistema per installare Archive::Zip da www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < È possibile scaricare un archivio tar contenente tutti i file/directory selezionati. Sarà poi possibile usare un applicativo locale, come tar o WinZip, per visualizzare o estrarre un file qualsiasi.

    Attenzione: a seconda dei file/directory selezionati, l\'archivio potrebbe essere molto grande. La creazione ed il trasferimento dell\'archivio potrebbe richiedere diversi minuti e sarà necessario disporre di abbastanza spazio sul proprio disco rigido locale per poterlo contenere.

    \$hiddenStr Creare l\'archivio relativamente a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (altrimenti l\'archivio conterrà percorsi completi).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Conferma ripristino su \$host"; $Lang{Are_you_sure} = < Si sta per avviare il ripristino diretto sulla macchina \$In{hostDest}. I file seguenti saranno ripristinati sulla condivisione \$In{shareDest} dal backup numero \$num:

    \$fileListStr
    File/directory originaleRipristinato su

    \$hiddenStr Avviare veramente?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: ripristino richiesto per \$hostDest"; $Lang{Reply_from_server_was___reply} = < La risposta del server è stata: \$reply

    Ritorna alla homepage di \$hostDest. EOF $Lang{BackupPC_Archive_Reply_from_server} = < La risposta del server è stata: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: prospetto backup host \$host"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Azioni utente")}

    \$startIncrStr
    \${h2("Prospetto backup")}

    Cliccare sul numero di backup per sfogliare e ripristinare i file di backup.

    \$deleteHdrStr \$str
    Numero backup Tipo Filled Livello Data avvio Durata (minuti) Età (giorni) Mantenere Commento

    \$restoreStr

    \${h2("Prospetto errori trasferimento")} \$errStr
    Numero backup Tipo Vedere Numero errori trasferimento Numero file con problemi Numero condivisioni con problemi Numero errori tar
    \${h2("Prospetto dimensioni file/contatore riutilizzo")}

    I file esistenti sono quelli già presenti nel pool; i file nuovi sono quelli aggiunti al pool. I file vuoti e gli errori SMB non sono conteggiati nei contatori di riutilizzo e file nuovi.

    \$sizeStr
    Totali File esistenti File nuovi
    Numero backup Tipo Numero file Dimensione (MB) Velocità (MB/s) Numero file Dimensione (MB) Numero file Dimensione (MB)
    \${h2("Prospetto compressione")}

    Prestazione della compressione per file già nel pool e per quelli nuovi.

    \$compStr
    File esistenti File nuovi
    Numero backup Tipo Livello compressione Dimensione (MB) Compresso (MB) Tasso compressione Dimensione (MB) Compresso (MB) Tasso compressione
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: prospetto archivi host \$host"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Azioni utente")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Errore"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Server"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Si sta sfogliando il backup numero \$num effettuato il \$backupTime (\$backupAge giorni fa), \$filledBackup
    • Entra directory:
    • Commento:
    • Fare clic su una directory per aprirla
    • Fare clic su un file per ripristinarlo
    • È possibile visualizzare la cronologia dei backup della directory corrente \$share2pathStr
    \${h2("Contents of \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mappatura del nome della condivisione sul percorso del client reale (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Cronologia backup directory per \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Questa videata mostra tutte le versioni uniche disponibili nei diversi backup:
    • Fare clic su un numero di backup per ritornare al navigatore di backup
    • Fare clic sul collegamento ad una directory (\$Lang->{DirHistory_dirLink}) per navigare nella directory stessa
    • Fare clic sul collegamento ad un file (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) per scaricare quel file
    • I file con lo stesso contenuto fra backup diversi hanno lo stesso numero di versione (ad esclusione di backup tra versione v3 e v4)
    • I file o directory non disponibili in uno specifico backup presentano una casella vuota
    • I file visualizzati con la stessa versione possono avere attributi diversi. Selezionare il numero di backup per visualizzare gli attributi del file.
    \${h2("Cronologia di \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Numero backup
    Data backup
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: dettagli ripristino numero \$num per \$host"; $Lang{Restore___num_details_for__host2} = <
    Numero \$Restores[\$i]{num}
    Richiesto da \$RestoreReq{user}
    Data richiesta \$reqTime
    Risultato \$Restores[\$i]{result}
    Messaggio d\'errore \$Restores[\$i]{errorMsg}
    Host sorgente \$RestoreReq{hostSrc}
    Numero backup sorgente \$RestoreReq{num}
    Condivisione sorgente \$RestoreReq{shareSrc}
    Host destinazione \$RestoreReq{hostDest}
    Condivisione destinazione \$RestoreReq{shareDest}
    Data avvio \$startTime
    Durata \$duration min
    Numero file \$Restores[\$i]{nFiles}
    Dimensione totale \${MB}MB
    Tasso trasferimento \${MBperSec}MB/s
    Errori creazione tar \$Restores[\$i]{tarCreateErrs}
    Errori trasferimento \$Restores[\$i]{xferErrs}
    File log trasferimento Vedi, Errori

    \${h1("Elenco file/directory")}

    \$fileListStr
    File/directory originaliRipristinato su
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Dettagli archivio n. \$num per \$host"; $Lang{Archive___num_details_for__host2} = <
    Numero \$Archives[\$i]{num}
    Richiesto da \$ArchiveReq{user}
    Data richiesta \$reqTime
    Risultato \$Archives[\$i]{result}
    Messaggio d\'errore \$Archives[\$i]{errorMsg}
    Data inizio \$startTime
    Durata \$duration\'
    Xfer log file Visualizza, Errori

    \${h1("Elenco host")}

    \$HostListStr
    HostNumero backup
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Prospetto email"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new fallita: controllare il file error_log di Apache\n"; $Lang{Wrong_user__my_userid_is___} = "Utente errato: il mio ID utente è \$> invece di \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Solo gli utenti privilegiati possono visualizzare i prospetti dei PC."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Solo gli utenti privilegiati possono arrestare o avviare un backup su \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Numero non valido: \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Impossibile aprire il file \$file: problema di configurazione?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Solo gli utenti privilegiati possono visualizzare i file di log o di configurazione."; $Lang{Only_privileged_users_can_view_log_files} = "Solo gli utenti privilegiati possono visualizzare i file di log."; $Lang{Only_privileged_users_can_view_email_summaries} = "Solo gli utenti privilegiati possono visualizzare il prospetto delle email."; $Lang{Only_privileged_users_can_browse_backup_files} = "Solo gli utenti privilegiati possono sfogliare i file di backup per l\'host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nome host vuoto."; $Lang{Directory___EscHTML} = "La directory \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} è vuota"; $Lang{Can_t_browse_bad_directory_name2} = "Impossibile sfogliare la director. Nome non valido: \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Solo gli utenti privilegiati possono ripristinare dei file di backup per l\'host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Nome host non valido \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Non è stato selezionato alcun file. Andare indietro per per selezionare un file."; $Lang{You_haven_t_selected_any_hosts} = "Non è stato selezionato alcun host. Andare indietro per selezionarne uno."; $Lang{Nice_try__but_you_can_t_put} = "Bella mossa, man non è possibile mettere \'..\' in nessun nome di file"; $Lang{Host__doesn_t_exist} = "L\'host \${EscHTML(\$In{hostDest})} non esiste"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Non si possiedono i permessi per ripristinare sull\'host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Impossibile creare/aprire \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Solo gli utenti privilegiati possono ripristinare i file per l\'host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nome host vuoto"; $Lang{Unknown_host_or_user} = "Host o utente sconosciuti \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Solo gli utenti privilegiati possono visualizzare le informazioni sull\'host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Solo gli utenti privilegiati possono visualizzare le informazioni sugli archivi."; $Lang{Only_privileged_users_can_view_restore_information} = "Solo gli utenti privilegiati possono visualizzare le informazioni di ripristino."; $Lang{Restore_number__num_for_host__does_not_exist} = "Il numero di ripristino \$num per l\'host \${EscHTML(\$host)} non esiste."; $Lang{Archive_number__num_for_host__does_not_exist} = "L'archivio numero \$num per l'host \${EscHTML(\$host)} non esiste."; $Lang{Can_t_find_IP_address_for} = "Impossibile trovare l\'indirizzo IP per \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Finché non vedo \$host ad un indirizzo DHCP preciso, sarà possibile avviare questa richiesta solo da quello stesso client. EOF ######################## # ok you can do it then ######################## $Lang{Backup_requested_on_DHCP__host} = "Richiesta di backup su DHCP \$host (\$In{hostIP}) da parte di \$User da \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Richiesta di backup per \$host da \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Backup arrestato/disaccodato per \$host da \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Richiesta di ripristino per l\'host \$hostDest, backup numero \$num, da parte di \$User da \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivio richiesto da parte di \$User da \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Stato"; $Lang{PC_Summary} = "Prospetto host"; $Lang{LOG_file} = "File log"; $Lang{LOG_files} = "File log"; $Lang{Old_LOGs} = "Vecchi log"; $Lang{Email_summary} = "Prospetto email"; $Lang{Config_file} = "File configurazione"; # $Lang{Hosts_file} = "File host"; $Lang{Current_queues} = "Code correnti"; $Lang{Documentation} = "Documentazione"; #$Lang{Host_or_User_name} = "Host o nome utente:"; $Lang{Go} = "Vai"; $Lang{Hosts} = "Host"; $Lang{Select_a_host} = "Selezionare un host..."; $Lang{There_have_been_no_archives} = "

    Non ci sono state archiviazioni

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Non è mai stato eseguito un backup per questo PC!!!

    \n"; $Lang{This_PC_is_used_by} = "
  • Questo PC è usato da \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Estrazione dei soli errori)"; $Lang{XferLOG} = "TransLOG"; $Lang{Errors} = "Errori"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <L\'ultima email inviata a \${UserLink(\$user)} è stata spedita il \$mailTime con oggetto "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Il comando \$cmd, avviato il \$startTime, è attualmente in esecuzione per \$host. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <L\'host \$host è accodato nella coda di background (il backup comincerà a breve). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <L\'host \$host è accodato nella coda utente (il backup comincerà a breve). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <È già presente un comando per \$host nella coda dei comandi (sarà eseguito a breve). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <L\'ultimo stato è \"\$Lang->{\$StatusHost{state}}\"\$reason del \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <L\'ultimo errore è \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <I ping verso \$host sono falliti per \$StatusHost{deadCnt} volte consecutive. EOF # ----- $Lang{Prior_to_that__pings} = "Prima di questo, i ping"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr verso \$host hanno avuto successo per \$StatusHost{aliveCnt} volte consecutive. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Poiché \$host è rimasto in rete per almeno \$Conf{BlackoutGoodCnt} volte consecutive, il backup non sarà effettuato dalle \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 alle \$t1 di \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <I backup sono stati posticipati per \$hours ore (modifica questo numero). EOF $Lang{tryIP} = " e \$StatusHost{dhcpHostIP}"; #$Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Seleziona tutto EOF $Lang{checkAllHosts} = <  Seleziona tutto EOF $Lang{fileHeader} = < Nome Tipo Modo Numero Dimensione Data modifica EOF $Lang{Home} = "Casa"; $Lang{Browse} = "Naviga backup"; $Lang{Last_bad_XferLOG} = "Ultimo TransLOG fallito"; $Lang{Last_bad_XferLOG_errors_only} = "Ultimo TransLOG fallito (solo errori)"; $Lang{This_display_is_merged_with_backup} = < Questa visualizzazione è fusa con il backup numero \$numF. EOF $Lang{Visit_this_directory_in_backup} = < Selezionare il backup che si desidera visualizzare: EOF $Lang{Restore_Summary} = < Fare clic sul numero del ripristino per maggiori dettagli. \$restoreStr
    Numero ripristino Risultato Data avvio Durata (minuti) Numero file Dimensione (MB) Numero errori tar Numero errori trasferimento

    EOF $Lang{Archive_Summary} = < Fare clic sul numero di archivio per maggiori dettagli. \$ArchiveStr
    Numero archivio Risultato Data avvio Durata minuti

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentazione"; $Lang{No} = "no"; $Lang{Yes} = "sì"; $Lang{The_directory_is_empty} = <La directory \$dirDisplay è vuota EOF #$Lang{on} = "acceso"; $Lang{off} = "spento"; $Lang{backupType_full} = "completo"; $Lang{backupType_incr} = "incrementale"; $Lang{backupType_active} = "in esecuzione"; $Lang{backupType_partial} = "parziale"; $Lang{failed} = "fallito"; $Lang{success} = "eseguito"; $Lang{and} = "e"; # ------ # Hosts states and reasons $Lang{Status_idle} = "inattivo"; $Lang{Status_backup_starting} = "avvio backup"; $Lang{Status_backup_in_progress} = "backup in esecuzione"; $Lang{Status_restore_starting} = "avvio ripristino"; $Lang{Status_restore_in_progress} = "ripristino in esecuzione"; $Lang{Status_admin_pending} = "collegamenti pendenti"; $Lang{Status_admin_running} = "collegamenti in esecuzione"; $Lang{Reason_backup_done} = "backup eseguito"; $Lang{Reason_restore_done} = "restore eseguito"; $Lang{Reason_archive_done} = "archivio eseguito"; $Lang{Reason_nothing_to_do} = "nulla da fare"; $Lang{Reason_backup_failed} = "backup fallito"; $Lang{Reason_restore_failed} = "restore fallito"; $Lang{Reason_archive_failed} = "archivio fallito"; $Lang{Reason_no_ping} = "no ping"; $Lang{Reason_backup_canceled_by_user} = "backup annullato dall\'utente"; $Lang{Reason_restore_canceled_by_user} = "ripristino annullato dall\'utente"; $Lang{Reason_archive_canceled_by_user} = "archivio annullato dall\'utente"; $Lang{Disabled_OnlyManualBackups} = "auto disabilitato"; $Lang{Disabled_AllBackupsDisabled} = "disabilitato"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: nessun backup riuscito per \$host"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain Subject: $subj $headers Ciao $userName, Il nostro software di backup non e` ancora riuscito ad effettuare un backup del tuo PC ($host). I backup dei PC dovrebbero essere eseguiti automaticamente quando il tuo PC e` connesso alla rete. E` necessario richiedere il supporto tecnico nel caso in cui: - il tuo PC sia stato connesso regolarmente alla rete, nel qual caso potrebbe sussistere un problema di configurazione o impostazione che impedisce l'esecuzione del backup; - non si desideri che sia eseguito il backup del proprio PC e che questo messaggio non sia piu` inviato. In caso contrario, assicurati che il tuo PC sia connesso alla rete la prossima volta che sei in ufficio. Ciao. BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: non ci sono backup recenti per \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain Subject: $subj $headers Ciao $userName, non e` stato effettuato correttamente il backup del tuo PC ($host) per $days giorni. Dal $firstTime fino a $days fa sono stati eseguiti con successo $numBackups backup. I backup dei PC dovrebbero avvenire automaticamente quando il tuo PC e` connesso alla rete. Se il tuo PC e` rimasto connesso alla rete solo per qualche ora durante gli ultimi $days giorni, dovresti contattare l'amministratore di sistema per capire perche' i backup non sono stati effettuati. In caso contrario, se sei fuori ufficio, non c'e` molto che tu possa fare, se non copiare manualmente i file particolarmente critici su un altro dispositivo. Tieni presente che qualsiasi file creato o modificato negli ultimi $days giorni (compresi i nuovi messaggi di posta elettronica e gli allegati) non possono essere ripristinato se il tuo PC si guasta. Ciao. BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: i file di Outlook su \$host richiedono un backup"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain Subject: $subj $headers Ciao $userName, Il backup dei file di Outlook presenti sul tuo PC $howLong. Questi file contengono tutti i tuoi messaggi di posta elettronica, gli allegati, i contatti e gli appuntamenti. Il backup del tuo PC e` stato effettuato correttamente $numBackups volte, a partire dal $firstTime fino a $lastTime giorni fa. Outlook, pero`, blocca tutti i suoi file quando e` in esecuzione, impedendo di fatto il backup dei suoi file. Ti consiglio di effettuare il backup dei file di Outlook quando sei collegato alla rete. E` sufficiente uscire da Outlook e da tutte le altre applicazioni e, semplicemente usando il tuo programma di navigazione, andare alla seguente pagina: $CgiURL?host=$host Seleziona "Avvia backup incrementale" due volte per avviare un nuovo backup incrementale. E` possibile selezionare "Ritorna alla pagina di $host" e quindi cliccare su "ricarica" per controllare lo stato del backup. Il backup dovrebbe essere pronto entro pochi minuti. Ciao. BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "non e` riuscito"; $Lang{howLong_not_been_backed_up_for_days_days} = "risale a \$days giorni fa"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < Nota: Se vuoi modificare un valore specifico per questo host, seleziona Sovrascrivi.

    EOF $Lang{CfgEdit_Button_Save} = "Salva"; $Lang{CfgEdit_Button_Insert} = "Inserisci"; $Lang{CfgEdit_Button_Delete} = "Cancella"; $Lang{CfgEdit_Button_Add} = "Aggiungi"; $Lang{CfgEdit_Button_Override} = "Sovrascrivi"; $Lang{CfgEdit_Button_New_Key} = "Nuova chiave"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Errore: Non salvo poiché sono presenti errori"; $Lang{CfgEdit_Error__must_be_an_integer} = "Errore: \$var deve essere un numero intero"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Errore: \$var deve esser un numero con un valore reale"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Errore: \$var entry \$k deve essere un numero intero"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Errore: \$var entry \$k deve esser un numero con un valore reale"; $Lang{CfgEdit_Error__must_be_executable_program} = "Errore: \$var deve essere un percorso valido"; $Lang{CfgEdit_Error__must_be_valid_option} = "Errore: \$var deve essere una opzione valida"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "L\'host da copiare \$copyHost non esiste; creo dunque l\'host \$fullHost da zero. Se non è quello che desideravi, cancella questo host."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User ha copiato la configurazione di \$fromHost su \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User ha cancellato \$p da \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User ha aggiunto \$p a \$conf, settandolo a \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User ha cambiato \$p su \$conf in \$valueNew da \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User ha cancellato l\'host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host ha cambiato \$key da \$valueOld in \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User ha aggiunto l\'host \$host: \$value\n"; BackupPC-4.4.0/lib/BackupPC/Lang/zh_CN.pm0000444000047500004750000016674313673511776016566 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "开始备档"; $Lang{Stop_Dequeue_Archive} = "中止ï¼å–消备档"; $Lang{Start_Full_Backup} = "开始完全备份"; $Lang{Start_Incr_Backup} = "开始增é‡å¤‡ä»½"; $Lang{Stop_Dequeue_Backup} = "中止ï¼å–消备份"; $Lang{Restore} = "æ¢å¤"; $Lang{Type_full} = "完全"; $Lang{Type_incr} = "增é‡"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹ç®¡ç†é€‰é¡¹ã€‚"; $Lang{H_Admin_Options} = "BackupPC æœåŠ¡å™¨ï¼šç®¡ç†é€‰é¡¹"; $Lang{Admin_Options} = "管ç†é€‰é¡¹"; $Lang{Admin_Options_Page} = < \${h2("æœåŠ¡å™¨æŽ§åˆ¶")}

    æ›´æ–°æœåС噍é…置:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "无法连接到 BackupPC æœåС噍"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < BackupPC æœåС噍 \$Conf{ServerHost} ç«¯å£ \$Conf{ServerPort} 此刻没有è¿è¡Œï¼ˆå¯èƒ½åˆšè¢«åœæ­¢ï¼Œæˆ–者还没被å¯åŠ¨ï¼‰ã€‚
    你想现在å¯åŠ¨å®ƒå—? EOF # ----- $Lang{H_BackupPC_Server_Status} = "BackupPC æœåŠ¡å™¨çŠ¶æ€"; $Lang{BackupPC_Server_Status_General_Info} = <
  • æœåŠ¡å™¨è¿›ç¨‹å·æ˜¯ \$Info{pid},è¿è¡Œåœ¨ä¸»æœº \$Conf{ServerHost} 上, ç‰ˆæœ¬å· \$Info{Version},开始è¿è¡ŒäºŽ \$serverStartTime。
  • æ­¤çŠ¶æ€æŠ¥å‘Šç”ŸæˆäºŽ \$now。
  • æœåС噍é…置最近一次加载于 \$configLoadTime。
  • æœåŠ¡å™¨ä»»åŠ¡é˜Ÿåˆ—ä¸‹æ¬¡å¯åŠ¨æ—¶é—´æ˜¯ \$nextWakeupTime。
  • 其它信æ¯ï¼š
    • \$numBgQueue 个自上次é—留备份请求,
    • \$numUserQueue 个待处ç†ç”¨æˆ·å¤‡ä»½è¯·æ±‚,
    • \$numCmdQueue 个待处ç†å‘½ä»¤è¯·æ±‚, \$poolInfo
    • 备份池文件系统ç£ç›˜ç©ºé—´å ç”¨çŽ‡æ˜¯ \$Info{DUlastValue}% (统计于 \$DUlastTime),今天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUDailyMax}%(统计于 \$DUmaxTime), 昨天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUDailyMaxPrev}%。
    • Inode 备份池文件系统ç£ç›˜ç©ºé—´å ç”¨çŽ‡æ˜¯ \$Info{DUInodelastValue}% (统计于 \$DUlastTime),今天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUInodeDailyMax}%(统计于 \$DUInodemaxTime), 昨天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUInodeDailyMaxPrev}%。
    EOF $Lang{BackupPC_Server_Status} = < \${h2("正在è¿è¡Œçš„任务")}

    \$jobStr
    客户机 类型 用户 开始时间 命令 è¿›ç¨‹å· ä¼ è¾“è¿›ç¨‹å· Status Count

    \$generalInfo \${h2("需è¦å…³æ³¨çš„错误")}

    \$statusStr
    客户机 类型 用户 最åŽä¸€æ¬¡å°è¯• 详情 错误时间 最åŽä¸€æ¬¡é”™è¯¯ï¼ˆ PING 失败除外)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: 客户机报告"; $Lang{BackupPC__Archive} = "BackupPC: 备档"; $Lang{BackupPC_Summary} = <

    • æ­¤çŠ¶æ€æŠ¥å‘Šç”ŸæˆäºŽ \$now。
    • 备份池文件系统ç£ç›˜ç©ºé—´å ç”¨çŽ‡æ˜¯ \$Info{DUlastValue}% (统计于 \$DUlastTime),今天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUDailyMax}%(统计于 \$DUmaxTime), 昨天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUDailyMaxPrev}%。
    • Inode 备份池文件系统ç£ç›˜ç©ºé—´å ç”¨çŽ‡æ˜¯ \$Info{DUInodelastValue}% (统计于 \$DUlastTime),今天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUInodeDailyMax}%(统计于 \$DUInodemaxTime), 昨天的最大å ç”¨çŽ‡æ˜¯ \$Info{DUInodeDailyMaxPrev}%。

    \${h2("å·²æˆåŠŸå®Œæˆå¤‡ä»½çš„客户机")}

    有 \$hostCntGood å°å®¢æˆ·æœºå·²å®Œæˆå¤‡ä»½ï¼Œæ€»æ•°æ˜¯ï¼š

    • \$fullTot ä¸ªå®Œå…¨å¤‡ä»½ï¼Œæ€»å¤§å°æ˜¯ \${fullSizeTot}GiB (被压缩å‰å€¼ï¼‰ï¼Œ
    • \$incrTot 个增é‡å¤‡ä»½ï¼Œæ€»å¤§å°æ˜¯ \${incrSizeTot}GiB (被压缩å‰å€¼ï¼‰ã€‚

    \$strGood
    客户机 用户 评论 完全备份个数 最åŽä¸€æ¬¡å®Œå…¨å¤‡ä»½ (天å‰) å®Œå…¨å¤‡ä»½å¤§å° (GiB) 完全备份速度 (MB/s) 增é‡å¤‡ä»½ä¸ªæ•° 最åŽä¸€æ¬¡å¢žé‡å¤‡ä»½ (天å‰) 最åŽä¸€æ¬¡å¤‡ä»½ (天å‰) 当å‰çŠ¶æ€ ä¼ è¾“é”™è¯¯æ•°ç›® 最åŽä¸€æ¬¡å¤‡ä»½ç»“æžœ
    \${h2("未备份过的客户机")}

    有 \$hostCntNone å°å®¢æˆ·æœºä»Žæœªè¢«å¤‡ä»½è¿‡ã€‚

    \$strNone
    客户机 用户 评论 完全备份个数 最åŽä¸€æ¬¡å®Œå…¨å¤‡ä»½ (天å‰) å®Œå…¨å¤‡ä»½å¤§å° (GiB) 完全备份速度 (MB/s) 增é‡å¤‡ä»½ä¸ªæ•° 最åŽä¸€æ¬¡å¢žé‡å¤‡ä»½ (天å‰) 最åŽä¸€æ¬¡å¤‡ä»½ (天å‰) 当å‰çŠ¶æ€ ä¼ è¾“é”™è¯¯æ•°ç›® 最åŽä¸€æ¬¡å¤‡ä»½ç»“æžœ
    EOF $Lang{BackupPC_Archive} = < 一共有 \$hostCntGood å°å®¢æˆ·æœºå·²ç»è¢«å¤‡ä»½ï¼Œæ€»å¤‡ä»½å¤§å°ä¸º \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    客户机 用户 备份大å°

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < 备档目的地ï¼å¤–设 EOF $Lang{BackupPC_Archive2_compression} = < 压缩 æ— 
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < 奇嶿 ¡éªŒæ•°æ®æ¯”例 (0 = ä¸å¯ç”¨ï¼Œ5 = 典型设置) EOF $Lang{BackupPC_Archive2_split} = < 将输出分开为 兆字节 EOF # ----------------------------------- $Lang{Pool_Stat} = <备份æœåŠ¡å™¨æ–‡ä»¶æ± å¤§å°æ˜¯ \${poolSize}GiB åŒ…å« \$info->{"\${name}FileCnt"} 个文件 å’Œ \$info->{"\${name}DirCnt"} 个文件夹ï¼ç›®å½•(截至 \$poolTime)。文件池大å°åŸºæœ¬å°±æ˜¯æ‰€æœ‰å¤‡ä»½æ•°æ®å ç”¨çš„实际ç£ç›˜ç©ºé—´ã€‚
  • æœåŠ¡å™¨æ–‡ä»¶æ± æ•£åˆ—æ“作(Hashing)å‘现 \$info->{"\${name}FileCntRep"} 个文件具有é‡å¤æ•£åˆ—值,其中 \$info->{"\${name}FileRepMax"} ä¸ªæ–‡ä»¶å…·æœ‰ç›¸åŒæ•£åˆ—å€¼ã€‚ç›¸åŒæ•£åˆ—值并䏿„味ç€ç›¸åŒæ–‡ä»¶ã€‚散列æ“作被用æ¥èŠ‚çœç›¸åŒæ–‡ä»¶æ‰€å ç”¨çš„ç£ç›˜ç©ºé—´ã€‚
  • æ¯æ—¥ä¾‹è¡Œæ¸…ç†è¿‡æœŸæ•°æ®æ“作删除了 \$info->{"\${name}FileCntRm"} 个文件共 \${poolRmSize}GiB (æ“作于 \$poolTime )。 EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: 客户机 \$host 有备份请求"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < æœåŠ¡å™¨ç­”å¤æ˜¯ï¼š\$reply

    返回 \$host 主页。 EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: 客户机 \$host 开始备份确认"; # -------------------------------- $Lang{Are_you_sure_start} = < ä½ å³å°†åœ¨å®¢æˆ·æœº \$host 上开始 \$type 备份。

    你能确定å—?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: 客户机 \$host åœæ­¢å¤‡ä»½ç¡®è®¤"; # -------------------------------- $Lang{Are_you_sure_stop} = < ä½ å³å°†åœ¨å®¢æˆ·æœº \$host ä¸Šåœæ­¢ï¼å–消备份æ“作;
    å¦‚æžœç¡®å®šå–æ¶ˆå¤‡ä»½æ“作,请从现在起 å°æ—¶å†…ä¸è¦å†å¯åЍå¦ä¸€å¤‡ä»½æ“作。

    你能确定å—?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹ä»»åŠ¡è¯·æ±‚é˜Ÿåˆ—ã€‚"; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æ‰§è¡Œå¤‡æ¡£æ“作。"; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: 队列报告"; # -------------------------------- $Lang{Backup_Queue_Summary} = < 下列用户请求排在队列中:

    \$strUser
    客户机 Action 请求时间 用户
    \${h2("åŽå°è¯·æ±‚队列报告")}

    下列åŽå°è¯·æ±‚排在队列中:

    \$strBg
    客户机 Action 请求时间 用户
    \${h2("命令队列报告")}

    下列命令请求排在队列中:

    \$strCmd
    客户机 Action 请求时间 用户 命令
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: 日志文件 \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, 修改时间 \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ 略过 \$skipped 行 ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \n无法打开日志文件 \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: 日志文件历å²";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    文件 å¤§å° ä¿®æ”¹æ—¶é—´
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    收信人 客户机 时间 标题
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: æµè§ˆå®¢æˆ·æœº \$host 备份åºåˆ—å· \$num"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: 客户机 \$host æ¢å¤é€‰é¡¹"; $Lang{Restore_Options_for__host2} = < 你从备份åºåˆ— #\$numï¼Œå· \$share 中选择了以下文件ï¼ç›®å½•:
      \$fileListStr

    你有三ç§é€‰æ‹©æ¥æ¢å¤è¿™äº›æ–‡ä»¶ï¼ç›®å½•。 è¯·ä»Žä¸‹åˆ—ä¸‰ç§æ–¹æ³•中选择其一。

    \${h2("方法 1:直接æ¢å¤")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost 上。

    警告: 客户机上现存的文件,如果和被æ¢å¤çš„æ–‡ä»¶å…·æœ‰ç›¸åŒæ–‡ä»¶å并且ä½äºŽç›¸åŒè·¯å¾„,其内容将会被替æ¢ï¼

    \$hiddenStr
    æ¢å¤åˆ°å®¢æˆ·æœº
    æ¢å¤åˆ°å·
    æ¢å¤åˆ°æ­¤ç›®å½•中
    (ä½äºŽä¸Šè¿°å·ä¸‹ï¼‰
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("方法 2:下载 Zip 备档")}

    ä½ å¯ä»¥å°†æ‰€æœ‰ä½ é€‰æ‹©çš„æ–‡ä»¶å’Œç›®å½•下载进一个 Zip 备档。然åŽå†ç”¨ä¸€ä¸ªæœ¬åœ°åº”用, 例如 WinZipï¼Œæ¥æµè§ˆæˆ–æå–其中的任何文件。

    警告: å–决于你选择的文件ï¼ç›®å½•,此备档å¯èƒ½ä¼šå ç”¨å¾ˆå¤§å­˜å‚¨ç©ºé—´ã€‚ å¯èƒ½éœ€è¦è‹¥å¹²åˆ†é’Ÿæˆ–æ›´é•¿æ—¶é—´æ¥ç”Ÿæˆå’Œä¼ è¾“此备档,并且还需è¦è¶³å¤Ÿå¤§çš„æœ¬åœ°ç£ç›˜ç©ºé—´ã€‚

    \$hiddenStr 备档中所有文件具有相对路径,在 \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} 目录内 (å¦åˆ™å¤‡æ¡£ä¸­æ–‡ä»¶å…·æœ‰å®Œæ•´è·¯å¾„)。
    选择压缩比(0ï¼ä¸åŽ‹ç¼©ï¼Œ1ï¼æœ€ä½Žä½†é€Ÿåº¦å¿«ï¼Œ...,9ï¼æœ€é«˜ä½†é€Ÿåº¦æ…¢ï¼‰
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("方法 2:下载 Zip 备档")}

    å› æœåŠ¡å™¨æ²¡æœ‰å®‰è£… Perl 组件 Archive::Zip,Zip 备档无法被生æˆã€‚ 请è”系系统管ç†å‘˜å®‰è£… Archive::Zipï¼Œä¸‹è½½åœ°å€ www.cpan.org。

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < ä½ å¯ä»¥å°†æ‰€æœ‰ä½ é€‰æ‹©çš„æ–‡ä»¶å’Œç›®å½•下载进一个 Tar 备档。然åŽå†ç”¨ä¸€ä¸ªæœ¬åœ°åº”用, 例如 tar 或 WinZipï¼Œæ¥æµè§ˆæˆ–æå–其中的任何文件。

    警告: å–决于你选择的文件ï¼ç›®å½•,此备档å¯èƒ½ä¼šå ç”¨å¾ˆå¤§å­˜å‚¨ç©ºé—´ã€‚ å¯èƒ½éœ€è¦è‹¥å¹²åˆ†é’Ÿæˆ–æ›´é•¿æ—¶é—´æ¥ç”Ÿæˆå’Œä¼ è¾“此备档,并且还需è¦è¶³å¤Ÿå¤§çš„æœ¬åœ°ç£ç›˜ç©ºé—´ã€‚

    \$hiddenStr 备档中所有文件具有相对路径,在 \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} 目录内 (å¦åˆ™å¤‡æ¡£ä¸­æ–‡ä»¶å…·æœ‰å®Œæ•´è·¯å¾„)。
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: 客户机 \$host 开始æ¢å¤ç¡®è®¤"; $Lang{Are_you_sure} = < ä½ å³å°†å¼€å§‹æ¢å¤æ•°æ®ç›´æŽ¥åˆ°å®¢æˆ·æœº \$In{hostDest} 上。 å‚¨å­˜åœ¨å¤‡ä»½å· \$num 中的下列文件将被æ¢å¤åˆ°å· \$In{shareDest} 内:

    \$fileListStr
    原始文件ï¼ç›®å½•将被æ¢å¤åˆ°

    \$hiddenStr 你确定å—?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: 客户机 \$hostDest 有æ¢å¤è¯·æ±‚"; $Lang{Reply_from_server_was___reply} = < æœåŠ¡å™¨ç­”å¤æ˜¯ï¼š\$reply

    返回 \$hostDest 主页。 EOF $Lang{BackupPC_Archive_Reply_from_server} = < æœåŠ¡å™¨ç­”å¤æ˜¯ï¼š\$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: 客户机 \$host 备份报告"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("用户æ“作")}

    \$startIncrStr

    \${h2("备份报告")}

    点击备份åºåˆ—å·æµè§ˆå’Œæ¢å¤æ–‡ä»¶ã€‚

    \$deleteHdrStr \$str
    备份åºåˆ—å·ï¼ƒ 类型 完整 备份级别 开始时间 耗时(分钟) è·ç¦»çŽ°åœ¨ï¼ˆå¤©å‰ï¼‰ ä¿æŒ 评论

    \$restoreStr

    \${h2("传输错误报告")} \$errStr
    备份åºåˆ—å·ï¼ƒ 类型 查看 传输错误数目 æŸå文件数目 æŸåæ–‡ä»¶ç³»ç»Ÿå·æ•°ç›® æŸå Tar 文件数目
    \${h2("文件大å°ï¼æ•°ç›®ç»Ÿè®¡")}

    "原有文件"是指原先已存在备份池中的文件;"新增文件"是指备份新写入池中的文件。 空文件ä¸è¢«ç»Ÿè®¡åœ¨å†…。

    \$sizeStr
    åˆè®¡ 原有文件 新增文件
    备份åºåˆ—å·ï¼ƒ 类型 文件数目 大å°(MB) 备份速度(MB/sec) 文件数目 大å°(MB) 文件数目 大å°(MB)
    \${h2("压缩报告")}

    备份池中原有文件和新增文件的压缩性能报告。

    \$compStr
    原有文件 新增文件
    备份åºåˆ—å·ï¼ƒ 类型 压缩级别 压缩å‰(MB) 压缩åŽ(MB) 压缩比 压缩å‰(MB) 压缩åŽ(MB) 压缩比
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: 客户机 \$host 备档报告"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("用户æ“作")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: 错误"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "æœåС噍"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • 你正在æµè§ˆå¤‡ä»½ #\$num,该备份开始于 \$backupTime (\$backupAge 天å‰ï¼‰ã€‚ \$filledBackup
    • 进入目录:
    • 评论:
    • 点击目录å进入相应目录。
    • ç‚¹å‡»æ–‡ä»¶åæ¢å¤ç›¸åº”文件。
    • 查看当å‰ç›®å½•的备份历å²ã€‚ \$share2pathStr
    \${h2("\$dirDisplay 的内容")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < 共享å到真实客户端路径的映射 (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: 客户机 \$host 目录备份历å²"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "目录"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < 本页显示文件在所有备份中的ä¸åŒç‰ˆæœ¬ï¼š
    • 点击备份åºåˆ—å·è¿”回相应备份æµè§ˆä¸»é¡µï¼Œ
    • 点击目录链接标记 (\$Lang->{DirHistory_dirLink}) 进入相应目录,
    • 点击文件版本链接标记 (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) 下载相应文件,
    • 如果一个文件的内容在多个备份中相åŒï¼Œæ–‡ä»¶åœ¨å¤šä¸ªå¤‡ä»½ä¸­å…·æœ‰ç›¸åŒç‰ˆæœ¬å·ï¼Œ(PleaseTranslateThis: except between v3 and v4 backups)
    • 如果一个文件或目录在æŸä¸ªå¤‡ä»½ä¸­ä¸å­˜åœ¨ï¼Œä¸‹è¡¨ä¸­ç”¨ç©ºç™½è¡¨ç¤ºï¼Œ
    • 具有相åŒç‰ˆæœ¬å·çš„æ–‡ä»¶å¯èƒ½åœ¨ä¸åŒå¤‡ä»½ä¸­æœ‰ä¸åŒçš„æ–‡ä»¶å±žæ€§ã€‚å¯ä»¥ç‚¹å‡»å¤‡ä»½åºåˆ—å·æ¥æŸ¥çœ‹æ–‡ä»¶åœ¨ç›¸åº”备份中的属性。
    \${h2("\$dirDisplay 的历å²")}
    \$backupNumStr\$backupTimeStr \$fileStr
    备份åºåˆ—å·
    备份时间
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: 客户机 \$host æ¢å¤ #\$num 详情"; $Lang{Restore___num_details_for__host2} = <
    æ¢å¤åºåˆ—å· \$Restores[\$i]{num}
    请求方 \$RestoreReq{user}
    请求时间 \$reqTime
    结果 \$Restores[\$i]{result}
    é”™è¯¯ä¿¡æ¯ \$Restores[\$i]{errorMsg}
    æºå®¢æˆ·æœº \$RestoreReq{hostSrc}
    æºå¤‡ä»½åºåˆ—å· \$RestoreReq{num}
    æºæ–‡ä»¶å· \$RestoreReq{shareSrc}
    目的客户机 \$RestoreReq{hostDest}
    ç›®çš„æ–‡ä»¶å· \$RestoreReq{shareDest}
    æ¢å¤å¼€å§‹æ—¶é—´ \$startTime
    耗时 \$duration 分钟
    文件个数 \$Restores[\$i]{nFiles}
    æ–‡ä»¶æ€»å¤§å° \${MB} MB
    传输速率 \$MBperSec MB/sec
    Tar 生æˆè¿‡ç¨‹é”™è¯¯ä¸ªæ•° \$Restores[\$i]{tarCreateErrs}
    传输过程错误个数 \$Restores[\$i]{xferErrs}
    传输日志文件 查看日志, 查看错误

    \${h1("文件ï¼ç›®å½•列表")}

    \$fileListStr
    原始文件ï¼ç›®å½•æ¢å¤è‡³
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: 客户机 \$host 备档 #\$num 详情"; $Lang{Archive___num_details_for__host2} = <
    备档åºåˆ—å· \$Archives[\$i]{num}
    请求方 \$ArchiveReq{user}
    请求方 \$reqTime
    结果 \$Archives[\$i]{result}
    é”™è¯¯ä¿¡æ¯ \$Archives[\$i]{errorMsg}
    开始时间 \$startTime
    耗时 \$duration 分钟
    传输日志文件 查看日志, 查看错误

    \${h1("客户机列表")}

    \$HostListStr
    客户机备份åºåˆ—å·
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: 电å­é‚®ä»¶æŠ¥å‘Š"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new 步骤失败:请检查 Apache æœåŠ¡å™¨æ—¥å¿—\n"; $Lang{Wrong_user__my_userid_is___} = "错误用户:我的用户 ID 是 \$>, 䏿˜¯ \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Only privileged users can view PC summaries."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æ‰§è¡Œå¤‡ä»½çš„å¼€å§‹æˆ–åœæ­¢æ“作于客户机 \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "无效数字 \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "无法打开文件 \$file:é…置有误?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹æ—¥å¿—或é…置文件。"; $Lang{Only_privileged_users_can_view_log_files} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹æ—¥å¿—文件。"; $Lang{Only_privileged_users_can_view_email_summaries} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹ç”µå­é‚®ä»¶æŠ¥å‘Šã€‚"; $Lang{Only_privileged_users_can_browse_backup_files} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æµè§ˆå®¢æˆ·æœº \${EscHTML(\$In{host})} 的备份文件。"; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "空客户机å。"; $Lang{Directory___EscHTML} = "目录 \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} 为空"; $Lang{Can_t_browse_bad_directory_name2} = "无法æµè§ˆéžæ³•目录å \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æ¢å¤å®¢æˆ·æœº \${EscHTML(\$In{host})} 的备份文件。"; $Lang{Bad_host_name} = "错误客户机å \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "你还没有选择任何文件;请返回上一页选择文件。"; $Lang{You_haven_t_selected_any_hosts} = "你还没有选择任何客户机;请返回上一页选择客户机。"; $Lang{Nice_try__but_you_can_t_put} = "对ä¸èµ·ï¼Œæ–‡ä»¶å内ä¸èƒ½åŒ…å« \'..\'"; $Lang{Host__doesn_t_exist} = "客户机 \${EscHTML(\$In{hostDest})} ä¸å­˜åœ¨"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "你没有æƒé™æ¢å¤å®¢æˆ·æœº \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "无法打开ï¼åˆ›å»º \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æ¢å¤å®¢æˆ·æœº \${EscHTML(\$host)} 的备份文件。"; $Lang{Empty_host_name} = "空客户机å"; $Lang{Unknown_host_or_user} = "未知客户机或用户 \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹å®¢æˆ·æœº \${EscHTML(\$host)} 的信æ¯ã€‚"; $Lang{Only_privileged_users_can_view_archive_information} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹å¤‡æ¡£ä¿¡æ¯ã€‚"; $Lang{Only_privileged_users_can_view_restore_information} = "åªæœ‰ç‰¹æƒç”¨æˆ·å¯ä»¥æŸ¥çœ‹æ¢å¤ä¿¡æ¯ã€‚"; $Lang{Restore_number__num_for_host__does_not_exist} = "客户机 \${EscHTML(\$host)} æ¢å¤åºåˆ—å· \$num ä¸å­˜åœ¨ã€‚"; $Lang{Archive_number__num_for_host__does_not_exist} = "客户机 \${EscHTML(\$host)} 备档åºåˆ—å· \$num ä¸å­˜åœ¨ã€‚"; $Lang{Can_t_find_IP_address_for} = "客户机 \${EscHTML(\$host)} çš„ IP åœ°å€æ— æ³•找到"; $Lang{host_is_a_DHCP_host} = < 除éžèŽ·å¾—å®¢æˆ·æœº \$host çš„åŠ¨æ€ IP 地å€ï¼Œå¦åˆ™åªèƒ½ä»Žå®¢æˆ·ä¸»æœºä¸Šå‘出此任务请求。 EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "用户 \$User 从 \$ENV{REMOTE_ADDR} å‘èµ·è¯·æ±‚å¤‡ä»½ä½¿ç”¨åŠ¨æ€ IP 的客户机 \$host (\$In{hostIP})"; $Lang{Backup_requested_on__host_by__User} = "用户 \$User å‘起请求备份客户机 \$host"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "用户 \$User åœæ­¢ï¼å–消了对客户机 \$host 的备份"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "用户 \$User 从 \$ENV{REMOTE_ADDR} å‘起请求æ¢å¤å®¢æˆ·æœº \$hostDest,使用备份åºåˆ—å· #\$num"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "用户 \$User 从 \$ENV{REMOTE_ADDR} å‘起备档请求"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "状æ€"; $Lang{PC_Summary} = "客户机报告"; $Lang{LOG_file} = "日志文件"; $Lang{LOG_files} = "日志文件列表"; $Lang{Old_LOGs} = "旧日志"; $Lang{Email_summary} = "电å­é‚®ä»¶æŠ¥å‘Š"; $Lang{Config_file} = "é…置文件"; # $Lang{Hosts_file} = "Hosts file"; $Lang{Current_queues} = "当å‰é˜Ÿåˆ—"; $Lang{Documentation} = "文档资料"; #$Lang{Host_or_User_name} = "Host or User name:"; $Lang{Go} = "确定"; $Lang{Hosts} = "客户机"; $Lang{Select_a_host} = "选择客户机å..."; $Lang{There_have_been_no_archives} = "

    è¿™å°æœºå™¨è¿˜ä»Žæ¥æ²¡æœ‰æ‰§è¡Œè¿‡å¤‡æ¡£æ“作ï¼

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    è¿™å°æœºå™¨è¿˜ä»Žæ¥æ²¡æœ‰è¢«å¤‡ä»½è¿‡ï¼ï¼

    \n"; $Lang{This_PC_is_used_by} = "
  • è¿™å°æœºå™¨çš„用户包括 \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "ï¼ˆåªæå–错误信æ¯ï¼‰"; $Lang{XferLOG} = "传输日志"; $Lang{Errors} = "错误"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <给用户 \${UserLink(\$user)} 的最近一å°é‚®ä»¶é€å‡ºäºŽ \$mailTime,标题是"\$subj"。 EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <命令 \$cmd 正在为客户机 \$host è¿è¡Œï¼Œå¼€å§‹äºŽ \$startTime。 EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <客户机 \$host 已在åŽå°é˜Ÿåˆ—中等待(å³å°†è¢«å¤‡ä»½ï¼‰ã€‚ EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <客户机 \$host 已在用户队列中等待(å³å°†è¢«å¤‡ä»½ï¼‰ã€‚ EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <针对客户机 \$host 的一æ¡å‘½ä»¤å·²åœ¨å‘½ä»¤é˜Ÿåˆ—中等待(å³å°†è¢«æ‰§è¡Œï¼‰ã€‚ EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <最åŽçŠ¶æ€æ˜¯ \"\$Lang->{\$StatusHost{state}}\"\$reason,当时时间 \$startTime。 EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <最åŽé”™è¯¯ä¿¡æ¯æ˜¯ \"\${EscHTML(\$StatusHost{error})}\"。 EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <试图与客户机 \$host è”系(Ping æ“作)已连续失败 \$StatusHost{deadCnt} 次。 EOF # ----- $Lang{Prior_to_that__pings} = "å…ˆå‰ï¼ŒPing"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr 客户机 \$host 已连续æˆåŠŸ \$StatusHost{aliveCnt} 次。 EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <因为客户机 \$host å·²ç»åœ¨ç½‘络上至少连续 \$Conf{BlackoutGoodCnt} 次, 在下列时段 \$blackoutStr,它将ä¸è¿›è¡Œå¤‡ä»½æ“作。 EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 在 \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <备份被推迟 \$hours å°æ—¶ (æ”¹å˜æ—¶é—´)。 EOF $Lang{tryIP} = " å’Œ \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  å…¨é€‰ EOF $Lang{checkAllHosts} = <  å…¨é€‰ EOF $Lang{fileHeader} = < 文件ï¼ç›®å½•å 类型 读写æƒé™ 备份åºåˆ—å· å¤§å° ä¿®æ”¹æ—¥æœŸ EOF $Lang{Home} = "主页"; $Lang{Browse} = "æµè§ˆå¤‡ä»½"; $Lang{Last_bad_XferLOG} = "最近出错传输日志"; $Lang{Last_bad_XferLOG_errors_only} = "最近出错传输日志(åªå«é”™è¯¯ï¼‰"; $Lang{This_display_is_merged_with_backup} = < 本页显示的是与备份åºåˆ— #\$numF åˆæˆçš„结果。 EOF $Lang{Visit_this_directory_in_backup} = < 选择你想查看的备份: EOF $Lang{Restore_Summary} = < 点击æ¢å¤åºåˆ—å·èŽ·å–详情。 \$restoreStr
    æ¢å¤åºåˆ—å· ç»“æžœ 开始时间 耗时(分钟) 文件个数 大å°(MB) Tar 错误个数 传输错误个数

    EOF $Lang{Archive_Summary} = < 点击备档åºåˆ—å·èŽ·å–详情。 \$ArchiveStr
    备档åºåˆ—å· ç»“æžœ 开始时间 耗时(分钟)

    EOF $Lang{BackupPC__Documentation} = "BackupPC: 文档资料"; $Lang{No} = "å¦"; $Lang{Yes} = "是"; $Lang{The_directory_is_empty} = <目录 \$dirDisplay 是空目录 EOF #$Lang{on} = "å¼€"; $Lang{off} = "å…³"; $Lang{backupType_full} = "完全"; $Lang{backupType_incr} = "增é‡"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "部分"; $Lang{failed} = "失败"; $Lang{success} = "æˆåŠŸ"; $Lang{and} = "å’Œ"; # ------ # Hosts states and reasons $Lang{Status_idle} = "空闲"; $Lang{Status_backup_starting} = "备份已开始"; $Lang{Status_backup_in_progress} = "备份进行中"; $Lang{Status_restore_starting} = "æ¢å¤å·²å¼€å§‹"; $Lang{Status_restore_in_progress} = "æ¢å¤è¿›è¡Œä¸­"; $Lang{Status_admin_pending} = "文件链接待建立"; $Lang{Status_admin_running} = "文件链接建立中"; $Lang{Reason_backup_done} = "完æˆ"; $Lang{Reason_restore_done} = "æ¢å¤å®Œæˆ"; $Lang{Reason_archive_done} = "备档完æˆ"; $Lang{Reason_nothing_to_do} = "空闲"; $Lang{Reason_backup_failed} = "备份失败"; $Lang{Reason_restore_failed} = "æ¢å¤å¤±è´¥"; $Lang{Reason_archive_failed} = "备档失败"; $Lang{Reason_no_ping} = "网络连接中断(no ping)"; $Lang{Reason_backup_canceled_by_user} = "å¤‡ä»½è¢«ç”¨æˆ·å–æ¶ˆ"; $Lang{Reason_restore_canceled_by_user} = "æ¢å¤è¢«ç”¨æˆ·å–消"; $Lang{Reason_archive_canceled_by_user} = "å¤‡æ¡£è¢«ç”¨æˆ·å–æ¶ˆ"; $Lang{Disabled_OnlyManualBackups} = "自动备份被关闭"; $Lang{Disabled_AllBackupsDisabled} = "关闭"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: 客户机 \$host 从未被æˆåŠŸå¤‡ä»½è¿‡"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers 尊敬的用户 $userName, 您的电脑 ($host) è¿˜ä»Žæ¥æ²¡æœ‰è¢«æˆ‘们的备份系统æˆåŠŸå¤‡ä»½è¿‡ã€‚ 正常情况下,当您的电脑与网络连接时电脑备份会自动进行。 如果您属于下é¢ä¸¤ç§æƒ…况,请与系统管ç†å‘˜è”系: ï¼ æ‚¨çš„ç”µè„‘ç»å¸¸æ˜¯è¿žåœ¨ç½‘络上的。这æ„味ç€å¯èƒ½æ˜¯æŸäº›é…ç½® æ–¹é¢çš„问题导致备份无法进行。 ï¼ æ‚¨ä¸å¸Œæœ›æ‚¨çš„ç”µè„‘è¢«å¤‡ä»½ï¼Œå¹¶ä¸”ä¸æ„¿å†æ”¶åˆ°è¿™äº›ç”µå­é‚®ä»¶ã€‚ å¦‚æžœä¸æ˜¯ä»¥ä¸Šè¿™äº›æƒ…况,请确认您的电脑是被连接在网络上的。 此致敬礼, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: 客户机 \$host 最近未被备份过"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers 尊敬的用户 $userName, 您的电脑 ($host) å·²ç»æœ‰ $days 天没有被æˆåŠŸå¤‡ä»½è¿‡äº†ã€‚æ‚¨çš„ç”µè„‘ 第一次被备份是在 $firstTime 天å‰ï¼Œç›´è‡³ $days 天å‰å·²ç»è¢«å¤‡ä»½è¿‡ $numBackups 次。 正常情况下,当您的电脑与网络连接时电脑备份会自动进行。 在最近 $days 天内,如果您的电脑已ç»ä¸Žç½‘ç»œè¿žæŽ¥äº†è‹¥å¹²å°æ—¶ï¼Œ 请与系统管ç†å‘˜è”系以判断为什么备份没有进行。 除此之外,如果您ä¸åœ¨åŠžå…¬å®¤ï¼Œæ‚¨åªèƒ½æ‰‹åŠ¨æ‹·è´é‡è¦æ–‡ä»¶åˆ°å…¶å®ƒå­˜å‚¨ä»‹è´¨ä¸Šã€‚ 应该æé†’您的是,如果您的电脑ç£ç›˜æŸå,您在最近 $days 天内创建或修改 的文件,包括新收到的电å­é‚®ä»¶å’Œé™„件,将无法被æ¢å¤ã€‚ 此致敬礼, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: 客户机 \$host 上的微软 Outlook 文件需è¦å¤‡ä»½"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers 尊敬的用户 $userName, 您的电脑上的 Outlook 文件 $howLong。 这些文件包括所有您的电å­é‚®ä»¶ï¼Œé™„ä»¶ï¼Œé€šè®¯å½•åŠæ—¥ç¨‹è¡¨ä¿¡æ¯ã€‚ 您的电脑第一次被备份是在 $firstTime 天å‰ï¼Œç›´è‡³ $lastTime 天å‰å·²ç»è¢« 备份过 $numBackups 次。但是,Outlook 在è¿è¡Œæ—¶é”使‰€æœ‰æ‰€å±žæ–‡ä»¶ï¼Œ 导致这些文件无法被备份。 建议您ä¾ä»¥ä¸‹æ–¹å¼å¤‡ä»½ Outlook 文件: 1。首先确认电脑是连接在网路上; 2。退出 Outlook åŠæ‰€æœ‰å…¶å®ƒåº”用; 3。使用网页æµè§ˆå™¨è®¿é—®æ­¤é“¾æŽ¥ï¼š $CgiURL?host=$host 选择 “开始增é‡å¤‡ä»½â€ï¼Œå¯åŠ¨å¢žé‡å¤‡ä»½æ“作;然åŽé€‰æ‹© “返回 $host 主页†并用æµè§ˆå™¨çš„ â€œåˆ·æ–°â€ åŠŸèƒ½æ¥æ£€æŸ¥è¯¥å¤‡ä»½æ“作的状æ€ã€‚ 此致敬礼, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "还从未被æˆåŠŸå¤‡ä»½è¿‡"; $Lang{howLong_not_been_backed_up_for_days_days} = "å·²ç»æœ‰ \$days 天未被备份过"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC æœåС噍"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < 注æ„:适用于所有客户机的全局性默认é…置,其相应 “替æ¢â€ æ—的方框是ä¸è¢«é€‰æ‹©çš„。如果è¦ä¿®æ”¹æœ¬å®¢æˆ·æœºçš„æŸé¡¹è®¾ç½®ï¼Œè¯·ç‚¹å‡» “替æ¢â€ æ—的方框。如果该设置已ç»å¤„于被修改状æ€ï¼Œåˆ™ä¿®æ”¹åŽä¸éœ€ç‚¹å‡» “替æ¢â€ æ—的方框。如果è¦å°†å…¶è¿˜åŽŸä½¿ç”¨é»˜è®¤é…置,则需点击 “替æ¢â€ æ—的方框,使其处于未被修改状æ€ã€‚

    EOF $Lang{CfgEdit_Button_Save} = "ä¿å­˜"; $Lang{CfgEdit_Button_Insert} = "æ’å…¥"; $Lang{CfgEdit_Button_Delete} = "删除"; $Lang{CfgEdit_Button_Add} = "添加"; $Lang{CfgEdit_Button_Override} = "替æ¢"; $Lang{CfgEdit_Button_New_Key} = "文件å·å(Windows Share)"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "错误:有误,无法ä¿å­˜"; $Lang{CfgEdit_Error__must_be_an_integer} = "错误:\$var 必须是整数"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "错误:\$var 必须是实数,ä¸èƒ½æ˜¯æµ®ç‚¹æ•°"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "错误:\$var 内容 \$k 必须是整数"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "错误:\$var 内容 \$k 必须是实数,ä¸èƒ½æ˜¯æµ®ç‚¹æ•°"; $Lang{CfgEdit_Error__must_be_executable_program} = "错误:\$var å¿…é¡»æ˜¯å¯æ‰§è¡Œç¨‹åº"; $Lang{CfgEdit_Error__must_be_valid_option} = "错误:\$var å¿…é¡»æ˜¯åˆæ³•选项"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "客户机 \$copyHost ä¸å­˜åœ¨ï¼›ç”Ÿæˆå…¨è®¡ç®—机å \$fullHostã€‚å¦‚æžœæ­¤å®¢æˆ·æœºä¸æ˜¯ä½ æƒ³è¦çš„,请将它删除。"; $Lang{CfgEdit_Log_Copy_host_config} = "用户 \$User æ‹·è´äº†å®¢æˆ·æœº \$fromHost çš„é…置到客户机 \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "用户 \$User 从é…ç½® \$conf 中删除了 \$p\n"; $Lang{CfgEdit_Log_Add_param_value} = "用户 \$User 添加了 \$p 到é…ç½® \$conf 中,值设为 \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "用户 \$User å°†é…ç½® \$conf 中的 \$p 从 \$valueOld 更改为 \$valueNew\n"; $Lang{CfgEdit_Log_Host_Delete} = "用户 \$User 删除了客户机 \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "用户 \$User 将客户机 \$host 上的 \$key 从 \$valueOld 更改为 \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "用户 \$User 添加了客户机 \$host: \$value\n"; #end of lang_zh_CN.pm BackupPC-4.4.0/lib/BackupPC/Lang/es.pm0000444000047500004750000017606213673511776016167 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Iniciar archivado"; $Lang{Stop_Dequeue_Archive} = "Detener/quitar de cola el archivado"; $Lang{Start_Full_Backup} = "Iniciar copia de seguridad completa"; $Lang{Start_Incr_Backup} = "Iniciar copia de seguridad incremental"; $Lang{Stop_Dequeue_Backup} = "Detener/quitar de cola la copia de seguridad"; $Lang{Restore} = "Restaurar"; $Lang{Type_full} = "completo"; $Lang{Type_incr} = "incremental"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Sólo los superusuarios pueden ver las opciones de administración."; $Lang{H_Admin_Options} = "Servidor BackupPC: Opciones de Administración"; $Lang{Admin_Options} = "Opciones de Admin"; $Lang{Admin_Options_Page} = < \${h2("Control del Servidor")}

    Actualizar configuración del servidor:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Imposible conectar al servidor BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < El error fué: \$err.
    Quizá el servidor BackupPC no está activo o hay un error de configuración. Por favor informe a su administrador de sistemas. EOF $Lang{Admin_Start_Server} = < El servidor BackupPC en \$Conf{ServerHost} port \$Conf{ServerPort} no está en funcionamiento ahora (puede haberlo detenido o no haberlo arrancado aún).
    ¿Quiere inicializarlo? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Estado del Servidor BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • El PID del servidor es \$Info{pid}, en el host \$Conf{ServerHost}, version \$Info{Version}, iniciado el \$serverStartTime.
  • Esta información de estado se ha generado el \$now.
  • La última configuración ha sido cargada a las \$configLoadTime
  • La cola de PC's se activará de nuevo el \$nextWakeupTime.
  • Información adicional:
    • \$numBgQueue solicitudes pendientes de copia de seguridad desde la última activación programada,
    • \$numUserQueue solicitudes pendientes de copia de seguridad de usuarios,
    • \$numCmdQueue solicitudes de comandos pendientes , \$poolInfo
    • El sistema de archivos estaba recientemente al \$Info{DUlastValue}% (\$DUlastTime), el máximo de hoy es \$Info{DUDailyMax}% (\$DUmaxTime) y el máximo de ayer era \$Info{DUDailyMaxPrev}%.
    • Inode El sistema de archivos estaba recientemente al \$Info{DUInodelastValue}% (\$DUlastTime), el máximo de hoy es \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) y el máximo de ayer era \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Trabajos en Ejecución")}

    \$jobStr
    Host Tipo Usuario Hora de Inicio Comando PID Transfer. PID Status Count

    \$generalInfo \${h2("Fallas que Requieren Atención")}

    \$statusStr
    Host Tipo Usuario Ultimo Intento Detalles Hora del error Ultimo error (diferente a no ping)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Resumen del Servidor"; $Lang{BackupPC__Archive} = "BackupPC: Archivo"; $Lang{BackupPC_Summary} = <

    • Este status ha sido generado el \$now.
    • El sistema de archivos estaba recientemente al \$Info{DUlastValue}% (\$DUlastTime), el máximo de hoy es \$Info{DUDailyMax}% (\$DUmaxTime) y el máximo de ayer era \$Info{DUDailyMaxPrev}%.
    • Inode El sistema de archivos estaba recientemente al \$Info{DUInodelastValue}% (\$DUlastTime), el máximo de hoy es \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) y el máximo de ayer era \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hosts con Buenas Copias de Seguridad")}

    Hay \$hostCntGood hosts que tienen copia de seguridad, de un total de :

    • \$fullTot copias de seguridad completas con tamaño total de \${fullSizeTot} GB (antes de agrupar y comprimir),
    • \$incrTot copias de seguridad incrementales con tamaño total de \${incrSizeTot} GB (antes de agrupar y comprimir).

    \$strGood
    Host Usuario Comentario # Completo Completo Antiguedad (días) Completo Tamaño (GB) Velocidad (MB/s) # Incr Incr Antiguedad (Días) Ultimo Backup (días) Estado Xfer errores Ultimo Intento
    \${h2("Hosts Sin Copias de Seguridad")}

    Hay \$hostCntNone hosts sin copias de seguridad.

    \$strNone
    Host Usuario Comentario # Completo Completo Antiguedad (días) Completo Tamaño (GB) Velocidad (MB/s) # Incr Incr Antiguedad (días) Ultimo Backup (días) Estado Xfer errores Ultimo Intento
    EOF $Lang{BackupPC_Archive} = < Hay \$hostCntGood hosts que tienen copia de seguridad con un tamaño total de \${fullSizeTot}GB

    \$strGood \$checkAllHosts
    Host Usuario Tamño de Backup

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Ubicación de archivo/Dispositivo EOF $Lang{BackupPC_Archive2_compression} = < Compression None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Porcentaje de datos de paridad (0 = deshabilitado, 5 = normal) EOF $Lang{BackupPC_Archive2_split} = < Dividir resultado en Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <El grupo tiene \${poolSize}GB incluyendo \$info->{"\${name}FileCnt"} archivos y \$info->{"\${name}DirCnt"} directorios (as of \$poolTime),
  • El procesamiento del grupo da \$info->{"\${name}FileCntRep"} archivos repetidos cuya cadena más larga es \$info->{"\${name}FileRepMax"},
  • El proceso de limpieza nocturna ha eliminado \$info->{"\${name}FileCntRm"} archivos de tamaño \${poolRmSize}GB (around \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Copia de Seguridad Solicitada en \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < La respuesta del servidor fué: \$reply

    Volver a \$host home page. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Confirme inicio de copia de seguridad en \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Está a punto de iniciar una copia de seguridad \$type en \$host.

    ¿Realmente quiere hacer esto?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Confirme Detener la Copia de Seguridad en \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Está a punto de detener/quitar de la cola las copias de seguridad en \$host;
    Asimismo, por favor no empiece otra copia de seguridad durante horas.

    ¿Realmente quiere hacer esto?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Sólo los administradores pueden ver las colas."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Sólo los administradores pueden archivar."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Resumen de la Cola"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Las siguientes solicitudes de usuarios están actualmente en cola:

    \$strUser
    Host Action Hora Solicitud Usuario
    \${h2("Resumen de Cola en Segundo Plano")}

    Las siguientes solicitudes en segundo plano están actualmente en cola:

    \$strBg
    Host Action Hora Solicitud Usuario
    \${h2("Resumen de Cola de Comandos")}

    Los siguientes comandos están actualmente en cola:

    \$strCmd
    Host Action Hora Solicitud Usuario Comando
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Archivo de Eventos \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, modificado \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ saltadas \$skipped lineas ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nNo puedo abrir el archivo de eventos \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Historial de Archivos de Eventos";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Archivo Tamaño Hora Modificación
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Destinatario Host Hora Asunto
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Explorar Copia de Seguridad \$num de \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Opciones de Restauración para \$host"; $Lang{Restore_Options_for__host2} = < Ha seleccionado los siguientes archivos/directorios de la unidad \$share, copia número #\$num:
      \$fileListStr

    Tiene tres opciones para restaurar estos archivos/directorios. Por favor, seleccione una de las siguientes opciones.

    \${h2("Opción 1: Restauración Directa")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    !Atención!: !Cualquier archivo existente con el mismo nombre que los que ha seleccionado será sobreescrito!

    \$hiddenStr
    Restaurar los archivos al host
    Restaurar los archivos a la unidad
    Restaurar los archivos bajo el directorio
    (relativo a la unidad)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Opción 2: Descargar archivo Zip")}

    Puede descargar un archivo comprimido (.zip) conteniendo todos los archivos y directorios que ha seleccionado. Después puede hacer uso de una aplicación local, como WinZip, para ver o extraer cualquiera de los archivos.

    !Atención!: Dependiendo de que archivos/carpetas haya seleccionado, este archivo puede ser muy grande. Podría tardar muchos minutos en crear y transferir el archivo. Además necesitará suficiente espacio el el disco local para almacenarlo.

    \$hiddenStr Hacer archivo relativo a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (en caso contrario el archivo contendrá las rutas completas).
    Compresión (0=desactivada, 1=rápida,...,9=mejor)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Opción 2: Descargar archivo Zip")}

    El programa Archive::Zip no está instalado, de modo que no podrá descargar un archivo comprimido zip. Por favor, solicite a su administrador de sistemas que instale Archive::Zip de www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Puede descargar un archivo comprimido (.Tar) conteniendo todos los archivos y directorios que ha seleccionado. Después puede hacer uso de una aplicación local, como Tar o WinZip,para ver o extraer cualquiera de los archivos.

    !Atención!: Dependiendo de que archivos/carpetas haya seleccionado, este archivo puede ser muy grande. Podría tardar muchos minutos crear y transferir el archivo. Además necesitará suficiente espacio el el disco local para almacenarlo.

    \$hiddenStr Hacer el archivo relativo a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (en caso contrario el archivo contendrá las rutas completas).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Confirme restauración en \$host"; $Lang{Are_you_sure} = < Está a punto de iniciar una restauración directamente a la máquina \$In{hostDest}. Los siguientes archivos serán restaurados en la unidad \$In{shareDest}, de la copia de seguridad número \$num:

    \$fileListStr
    Archivo/Dir Original Será restaurado a

    \$hiddenStr ¿Realmente quiere hacer esto?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Restauración solicitada en \$hostDest"; $Lang{Reply_from_server_was___reply} = < La respuesta del servidor fué: \$reply

    volver a \$hostDest home page. EOF $Lang{BackupPC_Archive_Reply_from_server} = < La respuesta del servidor fué: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Host \$host Resumen de Copia de Seguridad"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Acciones del Usuario")}

    \$startIncrStr

    \${h2("Resumen de Copia de Seguridad")}

    Haga click en el número de copia de seguridad para revisar y restaurar archivos.

    \$deleteHdrStr \$str
    Copia N° Tipo Completo Nivel Fecha Inicio Duración/min Antiguedad/días Mantener Comentario

    \$restoreStr

    \${h2("Resumen de Errores de Transferencia")} \$errStr
    Copia N° Tipo Ver N° Xfer errs N° err. archivos N° err. unidades N° err. tar
    \${h2("Resumen de Total/Tamaño de Archivos Reutilizados")}

    Los archivos existentes son aquellos que ya están en el lote; los nuevos son aquellos que se han añadido al lote. Los archivos vacíos y los errores SMB no cuentan en las cifras de reutilizados ni en la de nuevos.

    \$sizeStr
    Totales Archivos Existentes Archivos Nuevos
    Copia N° Tipo N° Archivos Tamaño/MB MB/sg N° Archivos Tamaño/MB N° Archivos Tamaño/MB
    \${h2("Resumen de Compresión")}

    Efectividad de compresión para los archivos ya existentes en el lote y los archivos nuevos comprimidos.

    \$compStr
    Archivos Existentes Archivos Nuevos
    Copia N° Tipo Nivel Comp Tamaño/MB Comp/MB Comp Tamaño/MB Comp/MB Comp
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archive Summary"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Acciones de usuario")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Error"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Servidor"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Está revisando la copia de seguridad N°\$num, que comenzó hacia las \$backupTime (hace \$backupAge días), \$filledBackup
    • Introduzca el directorio:
    • Comentario:
    • Haga click en uno de los directorios de abajo para revisar sus contenidos,
    • Haga click en un archivo para restaurarlo,
    • Puede ver la history de la copia de seguridad del directorio actual. \$share2pathStr
    \${h2("Contenido de \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Asignación del nombre compartido a la ruta real del cliente (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Histórico de copia de seguridad del directorio en \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Esta pantalla muestra cada versión única de archivos de entre todas las copias de seguridad:
    • Haga click en un número de copia de seguridad para volver al explorador de copias de seguridad,
    • Haga click en un vínculo de directorio (\$Lang->{DirHistory_dirLink}) para navegar en ese directorio,
    • Haga click en un vínculo de versión de archivo (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) para descargar ese archivo,
    • Los archivos con diferentes contenidos entre distintas copias de seguridad tienen el mismo número de versión (PleaseTranslateThis: except between v3 and v4 backups),
    • Los archivos o directorios que no existen en una copia concreta tienen una celda vacía.
    • Los archivos mostrados con la misma versión pueden tener diferentes atributos. Seleccione el número de copia de seguridad para ver los atributos del archivo.
    \${h2("Historia de \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Número de Backup
    Hora de Backup
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Detalles de la restauración N°\$num de \$host"; $Lang{Restore___num_details_for__host2} = <
    Número \$Restores[\$i]{num}
    Solicitado por \$RestoreReq{user}
    Hora Petición \$reqTime
    Resultado \$Restores[\$i]{result}
    Mensaje de Error \$Restores[\$i]{errorMsg}
    Host Origen \$RestoreReq{hostSrc}
    N° copia origen \$RestoreReq{num}
    Unidad origen \$RestoreReq{shareSrc}
    Host destino \$RestoreReq{hostDest}
    Unidad destino \$RestoreReq{shareDest}
    Hora comienzo \$startTime
    Duración \$duration min
    Número de archivos \$Restores[\$i]{nFiles}
    Tamaño total \${MB} MB
    Tasa de transferencia \$MBperSec MB/sec
    Errores creación Tar \$Restores[\$i]{tarCreateErrs}
    Errores de transferencia \$Restores[\$i]{xferErrs}
    Archivo eventos de transferencia View, Errors

    \${h1("Lista de Archivos/Directorios")}

    \$fileListStr
    Dir/archivo originalRestaurado a
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Copia de seguridad #\$num .Detalles de \$host"; $Lang{Archive___num_details_for__host2} = <
    Número \$Archives[\$i]{num}
    Solicitado por \$ArchiveReq{user}
    Hora petición \$reqTime
    Resultado \$Archives[\$i]{result}
    Mensaje de error \$Archives[\$i]{errorMsg}
    Hora comienzo \$startTime
    Duración \$duration min
    Archivo eventos Xfer View, Errors

    \${h1("Host list")}

    \$HostListStr
    HostCopia de seguridad número
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Resumen de Correos"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->nuevo ha fallado: revise el error_log de apache\n"; $Lang{Wrong_user__my_userid_is___} = "Usuario erróneo: mi userid es \$>, en lugar de \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Sólo los usuarios autorizados pueden ver los resúmenes de PC's."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Sólo los usuarios autorizados pueden iniciar o detener las copias de seguridad en \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Número no válido \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "No puedo abrir \$file: ¿problema de configuración?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Sólo los usuarios autorizados pueden ver los archivos de eventos o de configuración."; $Lang{Only_privileged_users_can_view_log_files} = "Sólo los usuarios autorizados pueden ver los archivos de eventos."; $Lang{Only_privileged_users_can_view_email_summaries} = "Sólo los usuarios autorizados pueden ver resúmenes de correo."; $Lang{Only_privileged_users_can_browse_backup_files} = "Sólo los usuarios autorizados pueden revisar los archivos de las copias de seguridad" . " para el Host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nombre de Host vacío."; $Lang{Directory___EscHTML} = "El directorio \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} está vacío"; $Lang{Can_t_browse_bad_directory_name2} = "No puedo mostrar un nombre de directorio erróneo \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Sólo los usuarios autorizados pueden restaurar copias de seguridad" . " para el host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Nombre de Host erróneo \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "No ha seleccionado nigún archivo; por favor, vuelva a seleccione algunos archivos."; $Lang{You_haven_t_selected_any_hosts} = "No ha seleccionado ningún host; por favor vuelva a seleccione algunos hosts."; $Lang{Nice_try__but_you_can_t_put} = "Buen intento, pero no puede usar \'..\' en los nombres de archivo"; $Lang{Host__doesn_t_exist} = "El Host \${EscHTML(\$In{hostDest})} no existe"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "No tiene autorización para restaurar en el host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "No puedo abrir/crear \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Sólo los usuarios autorizados pueden restaurar copias de seguridad del host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nombre de host vacío"; $Lang{Unknown_host_or_user} = "Host o usuario desconocido \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Sólo los usuarios autorizados pueden ver información del host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Sólo los usuarios autorizados pueden ver información de archivo."; $Lang{Only_privileged_users_can_view_restore_information} = "Sólo los usuarios autorizados pueden ver información de restauración."; $Lang{Restore_number__num_for_host__does_not_exist} = "El número de restauración \$num del host \${EscHTML(\$host)} no existe."; $Lang{Archive_number__num_for_host__does_not_exist} = "La copia de seguridad \$num del host \${EscHTML(\$host)} no existe."; $Lang{Can_t_find_IP_address_for} = "No puedo encontrar la dirección IP de \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Hasta que vea \$host en una dirección DHCP concreta, sólo puede iniciar este proceso desde la propia máquina cliente. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Copia de seguridad solicitada en DHCP \$host (\$In{hostIP}) por \$User desde \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Copia de seguridad solicitada en \$host por \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Copia de seguridad detenida/desprogramada en \$host por \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Restauración solicitada para el host \$hostDest, copia de seguridad #\$num," . " por \$User desde \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivo solicitado por \$User desde \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Estado"; $Lang{PC_Summary} = "Resumen de Hosts"; $Lang{LOG_file} = "Archivo de eventos"; $Lang{LOG_files} = "Archivos de eventos"; $Lang{Old_LOGs} = "Eventos antiguos"; $Lang{Email_summary} = "Resumen correo"; $Lang{Config_file} = "Archivo configuración"; # $Lang{Hosts_file} = "Archivo Hosts"; $Lang{Current_queues} = "Colas actuales"; $Lang{Documentation} = "Documentación"; #$Lang{Host_or_User_name} = "Host o usuario:"; $Lang{Go} = "Aceptar"; $Lang{Hosts} = "Hosts"; $Lang{Select_a_host} = "Seleccione un host..."; $Lang{There_have_been_no_archives} = "

    No ha habido archivos

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    !Nunca se ha hecho copia de seguridad de este Host!

    \n"; $Lang{This_PC_is_used_by} = "
  • Este Host es utilizado por \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Extrayendo sólo Errores)"; $Lang{XferLOG} = "TransfREG"; $Lang{Errors} = "Errores"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <El último mensaje enviado a \${UserLink(\$user)} fué a las \$mailTime, asunto "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <El comando \$cmd está ejecutandose para \$host, comenzado a \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <El host \$host está en cola en la cola en segundo plano (pronto tendrá copia de seguridad). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Host \$host está en cola en la cola de usuarios (pronto tendrá copia de seguridad). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Un comando para \$host está en la cola de comandos (se ejecutará pronto). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <El último estado fué \"\$Lang->{\$StatusHost{state}}\"\$reason a las \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <El último error fué \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Los pings a \$host han fallado \$StatusHost{deadCnt} veces consecutivas. EOF # ----- $Lang{Prior_to_that__pings} = "Antes de eso, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr a \$host han tenido éxito \$StatusHost{aliveCnt} veces consecutivas. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Dado que \$host ha estado en la red al menos \$Conf{BlackoutGoodCnt} veces consecutivas, no se le realizará copia de seguridad desde \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 hasta \$t1 en \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Las copias de seguridad se retrasarán durante \$hours horas (Cambie este número). EOF $Lang{tryIP} = " y \$StatusHost{dhcpHostIP}"; #$Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Seleccionar todo EOF $Lang{checkAllHosts} = <  Seleccionar todo EOF $Lang{fileHeader} = < Nombre Tipo Modo N° Tamaño Hora Mod. EOF $Lang{Home} = "Inicio"; $Lang{Browse} = "Explorar copias de seguridad"; $Lang{Last_bad_XferLOG} = "Ultimo error en eventos de transferencia"; $Lang{Last_bad_XferLOG_errors_only} = "Ultimo error en eventos de transferencia (errores sólo)"; $Lang{This_display_is_merged_with_backup} = < Esta pantalla está unida a la copia de seguridad N°\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Seleccione la copia de seguridad que desea ver: EOF $Lang{Restore_Summary} = < Haga click en el número de restauración para ver sus detalles. \$restoreStr
    Restauración N° Resultado Fecha Inicio Dur/mins N° Archivos MB N° Err. Tar N° Err. Transf.#xferErrs

    EOF $Lang{Archive_Summary} = < Hacer Click en el número de Archivo para más detalles. \$ArchiveStr
    Archive# Resultado Hora inicio Duración/mins

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentacion"; $Lang{No} = "no"; $Lang{Yes} = "si"; $Lang{The_directory_is_empty} = <El directorio \$dirDisplay está vacío EOF #$Lang{on} = "activo"; $Lang{off} = "inactivo"; $Lang{backupType_full} = "completo"; $Lang{backupType_incr} = "incremental"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "parcial"; $Lang{failed} = "fallido"; $Lang{success} = "éxito"; $Lang{and} = "y"; # ------ # Hosts states and reasons $Lang{Status_idle} = "inactivo"; $Lang{Status_backup_starting} = "comenzando copia de seguridad"; $Lang{Status_backup_in_progress} = "copia de seguridad ejecutándose"; $Lang{Status_restore_starting} = "comenzando restauración"; $Lang{Status_restore_in_progress} = "restauración ejecutándose"; $Lang{Status_admin_pending} = "conexión pendiente"; $Lang{Status_admin_running} = "conexión en curso"; $Lang{Reason_backup_done} = "copia de seguridad realizada"; $Lang{Reason_restore_done} = "restauración realizada"; $Lang{Reason_archive_done} = "archivado realizado"; $Lang{Reason_nothing_to_do} = "nada por hacer"; $Lang{Reason_backup_failed} = "copia de seguridad fallida"; $Lang{Reason_restore_failed} = "restauración fallida"; $Lang{Reason_archive_failed} = "ha fallado el archivado"; $Lang{Reason_no_ping} = "no hay ping"; $Lang{Reason_backup_canceled_by_user} = "copia cancelada por el usuario"; $Lang{Reason_restore_canceled_by_user} = "restauración cancelada por el usuario"; $Lang{Reason_archive_canceled_by_user} = "archivado cancelado por el usuario"; $Lang{Disabled_OnlyManualBackups} = "auto deshabilitado"; $Lang{Disabled_AllBackupsDisabled} = "deshabilitado"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: ningúna copia de \$host ha tenido éxito"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Estimado $userName, Su PC ($host) nunca ha completado una copia de seguridad mediante nuestro programa de copias de seguridad. Las copias de seguridad deberían ejecutarse automáticamente cuando su PC se conecta a la red. Debería contactar con su soporte técnico si: - Su ordenador ha estado conectado a la red con regularidad. Esto implicaría que existe algún problema de instalación o configuración que impide que se realicen las copias de seguridad. - No desea realizar copias de seguridad y no quiere recibir más mensajes como éste. De no ser así, asegúrese de que su PC está conectado a la red la próxima vez que esté en la oficina. Saludos: Agente BackupPC https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: no hay copias de seguridad recientes de \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Estimado $userName, No se ha podido completar ninguna copia de seguridad de su PC ($host) durante $days días. Su PC ha realizado copias de seguridad correctas $numBackups veces desde $firstTime hasta hace $days días. Las copias de seguridad deberían efectuarse automáticamente cuando su PC está conectado a la red. Si su PC ha estado conectado durante algunas horas a la red durante los últimos $days días debería contactar con su soporte técnico para ver porqué las copias de seguridad no funcionan adecuadamente. Por otro lado, si está fuera de la oficina, no hay mucho que se pueda hacer al respecto salvo copiar manualmente los archivos especialmente críticos a otro soporte físico. Debería estar al corriente de que cualquier archivo que haya creado o modificado en los últimos $days días (incluyendo todo el correo nuevo y archivos adjuntos) no pueden ser restaurados si su disco se avería. Saludos: Agente BackupPC https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Los archivos de Outlook de \$host necesitan ser copiados"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Estimado $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, ---------------------------------------------------------------- Los archivos de Outlook de su PC tienen $howLong. Estos archivos contienen todo su correo, adjuntos, contactos e información de su agenda. Los archivos de su PC han sido correctamente salvaguardados $numBackups veces desde $firstTime hasta hace $lastTime días. Sin embargo, Outlook bloquea todos sus archivos mientras funciona, impidiendo que pueda hacerse una copia de seguridad de los mismos. Se le recomienda hacer copia de seguridad de los archivos de Outlook cuando esté conectado a la red cerrando Outlook y el resto de aplicaciones y utilizando su navegador de internet haga click en este vínculo: $CgiURL?host=$host Seleccione "Iniciar copia de seguridad incremental" dos veces para iniciar una neva copia de seguridad incremental. Puede seleccionar "Volver a la página de $host " y luego de click en "refrescar" para verificar el estado del proceso de copia de seguridad. Debería llevarle sólo unos pocos minutos completar el proceso. Saludos: Agente BackupPC https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "no se le ha realizado una copia de seguridad con éxito"; $Lang{howLong_not_been_backed_up_for_days_days} = "no se le ha realizado una copia de seguridad durante \$days días"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "Servidor BackupPC"; $Lang{RSS_Doc_Description} = "RSS feed para BackupPC"; $Lang{RSS_Host_Summary} = < Nota: Marque 'Reemplazar' si desea modificar un valor específico a este host.

    EOF $Lang{CfgEdit_Button_Save} = "Grabar"; $Lang{CfgEdit_Button_Insert} = "Insertar"; $Lang{CfgEdit_Button_Delete} = "Borrar"; $Lang{CfgEdit_Button_Add} = "Aumentar"; $Lang{CfgEdit_Button_Override} = "Reemplazar"; $Lang{CfgEdit_Button_New_Key} = "Nueva Llave"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "ENG Error: No grabó debido a errores"; $Lang{CfgEdit_Error__must_be_an_integer} = "Error: \$var debe ser un entero"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Error: \$var debe ser un número de valor real"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Error: \$var ingreso \$k debe ser un entero"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Error: \$var ingreso \$k debe ser un número de valor real"; $Lang{CfgEdit_Error__must_be_executable_program} = "Error: \$var debe ser una ruta de acceso ejecutable válida"; $Lang{CfgEdit_Error__must_be_valid_option} = "Error: \$var debe ser una opción válida"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Copia del host \$copyHost no existe; creando nombre completo del host \$fullHost. Elimine este host si eso no es lo que deseaba."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User copió configuración del host \$fromHost a \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User borró \$p de \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User aumentó \$p a \$conf, con el valor \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User cambió \$p en \$conf a \$valueNew de \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User borró host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host cambió \$key de \$valueOld a \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User aumentó host \$host: \$value\n"; #end of es.pm backuppc ver 3.3.0 - luis bustamante olivera - luisbustamante@yahoo.com BackupPC-4.4.0/lib/BackupPC/Lang/pl.pm0000444000047500004750000016362713673511776016176 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Zacznij ArchiwizacjÄ™"; $Lang{Stop_Dequeue_Archive} = "Zatrzymaj/Odkolejkuj ArchiwizacjÄ™"; $Lang{Start_Full_Backup} = "Zacznij PeÅ‚nÄ… KopiÄ™ BezpieczeÅ„stwa"; $Lang{Start_Incr_Backup} = "Zacznij InkrementacyjnÄ… KopiÄ™ BezpieczeÅ„stwa"; $Lang{Stop_Dequeue_Backup} = "Zatrzymaj/Odkolejkuj KopiÄ™ BezpieczeÅ„stwa"; $Lang{Restore} = "Przywróć"; $Lang{Type_full} = "peÅ‚ny"; $Lang{Type_incr} = "inkrementacyjny"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Tylko uprzywilejowani użytkownicy mogÄ… oglÄ…dać opcje administracyjne"; $Lang{H_Admin_Options} = "Serwer BackupPC: Opcje Administracyjne"; $Lang{Admin_Options} = "Opcje Administracyjne"; $Lang{Admin_Options_Page} = < \${h2("Kontrola Serwera")}

    Wczytaj ponownie konfiguracjÄ™ serwera:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Nie można połączyć się z serwerem BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < Błąd to: \$err.
    Możliwe ,że serwer BackupPC nie jest uruchomiony albo że występuje błąd w konfiguracji. Proszę powiadomić o tym swojego Administratora. EOF $Lang{Admin_Start_Server} = < Serwer BackupPC na \$Conf{ServerHost} porcie \$Conf{ServerPort} nie działa (może tylko go wyłączyłeś, albo po prostu nie wlaczyłeś).
    Czy chcesz go włączyć? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Status Serwera BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • PID serwera to \$Info{pid}, na hoÅ›cie \$Conf{ServerHost}, wersja \$Info{Version}, włączony \$serverStartTime.
  • WYgenerowanie statusu : \$now.
  • Ostatnie Å‚adowanie konfiguracji : \$configLoadTime.
  • NastÄ™pne kolejkowanie : \$nextWakeupTime.
  • Inne Informacje:
    • \$numBgQueue oczekujÄ…cych żądaÅ„ kopii bezpieczeÅ„stwa od czasu ostatniego zaplanowanego dziaÅ‚ania,
    • \$numUserQueue oczekujacych żądaÅ„ kopii bezpieczeÅ„stwa od uzytkowników,
    • \$numCmdQueue oczekujÄ…cych poleceÅ„ do wykonania, \$poolInfo
    • Ostatni obszar systemu plików to \$Info{DUlastValue}% (\$DUlastTime), dzisiejsza maksymalna wartość to \$Info{DUDailyMax}% (\$DUmaxTime) a wczorajszy byÅ‚ \$Info{DUDailyMaxPrev}%.
    • Inode Ostatni obszar systemu plików to \$Info{DUInodelastValue}% (\$DUlastTime), dzisiejsza maksymalna wartość to \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) a wczorajszy byÅ‚ \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Aktualnie Działające Prace")}

    \$jobStr
    Host Typ Użytkownik Początek Polecenie PID Xfer PID Status Count

    \$generalInfo \${h2("Błędy które wymagają uwagi")}

    \$statusStr
    Host Typ Użytkownik Ostatnia próba Detale Czas Ostatni błąd (inny niż brak połączenia(pingu))
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: WyciÄ…g Hostow"; $Lang{BackupPC__Archive} = "BackupPC: Archiwum"; $Lang{BackupPC_Summary} = <

    • Ten status zostaÅ‚ wygenerowany o \$now.
    • Ostatni obszar systemu plików to \$Info{DUlastValue}% (\$DUlastTime), dzisiejsza maksymalna wartość to \$Info{DUDailyMax}% (\$DUmaxTime) a wczorajszy byÅ‚ \$Info{DUDailyMaxPrev}%.
    • Inode Ostatni obszar systemu plików to \$Info{DUInodelastValue}% (\$DUlastTime), dzisiejsza maksymalna wartość to \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) a wczorajszy byÅ‚ \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hosty z bezbłędnie wykonaną kopią bezpieczeństwa ")}

    Jest \$hostCntGood hostów które zostaly zabezpieczone, na całkowita liczbę:

    • \$fullTot peÅ‚nych kopi bezpieczeÅ„stwa na peÅ‚nÄ… sumÄ™ \${fullSizeTot}GiB (przed kompresjÄ…),
    • \$incrTot inkrementalnych kopi bezpieczeÅ„stwa na peÅ‚nÄ… sume \${incrSizeTot}GiB (przed kompresjÄ…).

    \$strGood
    Host Użytwkonik Komentarz #Pełny Pełny Wiek (dni) Pełny Rozmiar (GiB) Prędkość (MB/s) #Inkr Wiek Inkr (dni) Ostatnia kopia bezpieczeństwa (dni) Status #Xfer błędó Ostatnia próba
    \${h2("Hosty bez wykonanej kopii bezpieczeństwa")}

    Jest \$hostCntNone hostów bez kopii bezpieczeństwa.

    \$strNone
    Host Użytkonik Komentarz #Pełny Pełny Wiek (dni Pełny Rozmiar (GiB) Prędkość (MB/s) #Inkr Wiek Inkr (dni) Ostatnia kopia bezpieczeństwa (dni) Status #Xfer błędó Ostatnia próba
    EOF $Lang{BackupPC_Archive} = < Jest \$hostCntGood hostów które mają kopie bezpieczeństwa na sumę \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host Uzytkownik Rozmiar Kopii Bezpieczeństwa

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Lokalizacja Archiwum EOF $Lang{BackupPC_Archive2_compression} = < Kompresja None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Procent parytetowanych danych (0 = wyłączone, 5 = typowe) EOF $Lang{BackupPC_Archive2_split} = < Rozdziel wyjście na Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <Pula to \${poolSize}GiB zawiera \$info->{"\${name}FileCnt"} plików oraz \$info->{"\${name}DirCnt"} katalogów (zajęło \$poolTime),
  • Hashowanie puli daje \$info->{"\${name}FileCntRep"} powtarzajÄ…cych siÄ™ plików z najdÅ‚uższym Å‚ancuchem \$info->{"\${name}FileRepMax"},
  • Nocne czyszczenie usunęło \$info->{"\${name}FileCntRm"} plików o rozmiarze \${poolRmSize}GiB (zajęło \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Kopia rzÄ…dana na \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Odpowiedź serwera to : \$reply

    Wróć do strony domowej \$host. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Potwierdzony start kopii na \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Zamierzasz zaczać kopie \$type na \$host.

    Czy napewno chcesz tego ?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Zatrzymaj potwierdzoną kopie na \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Zamierzasz zatrzymać wykonywanie kopii na \$host;
    Prosze nie zaczynac nowej kopii przez godzin.

    Czy naprawdÄ™ tego chcesz ?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Tylko uprzywilejowani użytwkonicy mogą przeglądać kolejki"; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "ylko uprzywilejowani użytwkonicy mogą archiwizować."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Podsumowanie kolejki"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Następujący użytkonicy są w kolejce:

    \$strUser
    Host Action Czas do Użytkownik
    \${h2("Podsumowanie kolejki w tle")}

    Następujące kolejki będące w tle czekają na wykonanie :

    \$strBg
    Host Action Czas do uzytkownik
    \${h2("Podsumowanie kolejki poleceń")}

    Następujące kolejki poleceń czekają na wykonanie :

    \$strCmd
    Host Action Czas do Użytkownik Polecenie
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Plik \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, zmodyfikowne \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ pominięto \$skipped linii ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nNie można otworzyc dziennika \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Historia Dziennika";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Plik Rozmiar Czas Modyfikacji
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Adresat Nadawca Czas Temat
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Przeglądaj \$num dla \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Przywróć opcje dla \$host"; $Lang{Restore_Options_for__host2} = < Zaznaczyłeś następujące pliki/katalogi z udziału \$share, kopia numer #\$num:
      \$fileListStr

    Masz do wyboru trzy możliwośći przywrócenia tych plików/katalogów. Proszę wybrać jedna z nich.

    \${h2("Opcja Pierwsza: Bezposrednie przywrócenie")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Uwaga: jakikolwiek plik pasujący do tych ktore masz zaznaczone będzie nadpisany !

    \$hiddenStr
    Przywrócenie plików na host
    Przywrócenie plików do udziału
    Przywróć pliki poniżej
    (podobne do udziału)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Opcja Druga: ÅšciÄ…gnij Archiwum Zip")}

    Możesz ściągnąc archiwum Zip zawieające wszystkie pliki/katalogi które zaznaczyłeś. Możesz wtedy użyć lokalnej aplikacji, Takiej jak 7Zip, do przeglądania czy wypakowania danych.

    Uwaga: zależnie od wybranych plików/katalogów , to archiwum może być bardzo duże. Może zajać dużo czasu do stworzenia i przesłania go, także będziesz potrzebował odpowiedniej ilości miejsca na dysku do przechowania.

    \$hiddenStr Stworzyć archiwum powiązane z \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (inaczej bedzie zawierac pełne scieżki do plików).
    Kompresja (0=off, 1=fast,...,9=best)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Opcja Druga: ÅšciÄ…gnij Archiwum Zip")}

    Archive::Zip nie jest zainstalowane więc nie możesz ściągnąć archiwum Zip. Proszę poprosić swojego Administratora aby zainstalował Archive::Zip z www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Możesz ściągnąc archiwum Tar zawieające wszystkie pliki/katalogi które zaznaczyłeś. Możesz wtedy użyć lokalnej aplikacji, Takiej jak 7Zip, do przeglądania czy wypakowania danych.

    Uwaga: zależnie od wybranych plików/katalogów , to archiwum może być bardzo duże. Może zajać dużo czasu do stworzenia i przesłania go, także będziesz potrzebował odpowiedniej ilości miejsca na dysku do przechowania.

    \$hiddenStr Stworzyć archiwum powiązane z\${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (inaczej bedzie zawierac pełne scieżki do plików).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Potwiedź przywrócenie na \$host"; $Lang{Are_you_sure} = < Zaczynasz przywracanie bezpośrednio na maszynę \$In{hostDest}. Następujące pliki zostaną przywrócene na udział \$In{shareDest}, z kopii numer \$num:

    \$fileListStr
    Orginalny plik/katalogBędzie przywrócony na

    \$hiddenStr Czy napewno chcesz tego ?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Rządanie przywrócenie na \$hostDest"; $Lang{Reply_from_server_was___reply} = < Odpowiedź serwera : \$reply

    Wróć stronę domową \$hostDest. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Odpowiedź serwera : \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Podsumowanie kopii bezpieczeństwa hosta \$host"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Działania użytwkonika")}

    \$startIncrStr

    \${h2("Podsumowanie Kopii Bezpieczeństwa")}

    Kliknij na numer kopii aby przeglądać i przywracać wybrane pliki/katalogi.

    \$deleteHdrStr \$str
    Backup# Typ Wypełniony Poziom Początek Czas trwania w min. Wiek/dni Trzymać Komentarz

    \$restoreStr

    \${h2("Podsumowanie błędów Xfer")} \$errStr
    Backup# Typ Widok #Xfer błędó #bad plików #bad udziałów #tar błędów
    \${h2("Ilość/wielkość użytych ponownie plików")}

    Istniejące pliki to te będące aktualnie w puli; nowe pliki to te dodane do puli. Puste pliki i błędy SMB nie są liczone.

    \$sizeStr
    ÅÄ…cznie IstniejÄ…cych plików Nowych plików
    Kopia nr Typ Plików Rozmiar/MB MB/sek Plików Rozmiar/MB Plików Rozmiar/MB
    \${h2("Podsumowanie Kompresji")}

    Wydajność kompresji dla plików będących w puli oraz tych świeżo skompresowanych.

    \$compStr
    IstniejÄ…ce Pliki Nowe Pliki
    Kopia nr Typ Poziom Kompresji Rozmiar/MB Kompresja/MB Kompresja Rozmiar/MB Kompresja/MB Kompresja
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Podsumowanie Archiwizacji hosta \$host"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Działania Użytkownika")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Błąd"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Serwer"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Przegladasz kopie nr #\$num, która zaczeÅ‚a siÄ™ okoÅ‚o \$backupTime (\$backupAge dni temu), \$filledBackup
    • Wpisz adres:
    • Komentarz:
    • Wpisz adres aby przejść do niego,
    • Kliknij plik aby go przywrócić,
    • Możesz zobaczyć kopie history obecnego adresu. \$share2pathStr
    \${h2("Zawartość \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mapowanie nazwy udziału na ścieżkę rzeczywistego klienta (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Histria kopii dla \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "adres"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Przedstawienie każdej unikalnej wersji każdego pliku we wszystkich kopiach:
    • Kliknij na numerze kopii aby przejść do przegladania tejże kopii,
    • KLiknij na adres (\$Lang->{DirHistory_dirLink}) aby przejść do niego,
    • Kliknij na wersje pliku (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) aby śćiagnać ten plik,
    • Pliki z tÄ… samÄ… zawartoÅ›ciÄ… pomiÄ™dzy różnymi kopiami majÄ… ten sam numer wersji (PleaseTranslateThis: except between v3 and v4 backups),
    • Pliki lub adresy ,które nie sÄ… dostÄ™pne w okreÅ›lonej kopii nie sÄ… zaznaczone.
    • Pliki pokazane z tÄ… samÄ… wersjÄ… mogÄ… mieć inny atrybut. Wybierz numer kopii aby zobaczyć atrybuty plików.
    \${h2("Historia \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Numer kopii
    Czas trwania kopii
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Przywróć #\$num detali dla \$host"; $Lang{Restore___num_details_for__host2} = <
    Numer \$Restores[\$i]{num}
    Żądane przez \$RestoreReq{user}
    Czas żądania \$reqTime
    Wynik \$Restores[\$i]{result}
    Wiadomość błędu \$Restores[\$i]{errorMsg}
    Host źródłowy \$RestoreReq{hostSrc}
    Źródło kopii nr \$RestoreReq{num}
    Źródło udziału \$RestoreReq{shareSrc}
    Host docelowy \$RestoreReq{hostDest}
    Udział docelowy \$RestoreReq{shareDest}
    Czas rozpoczęcia \$startTime
    Czas trwania \$duration min
    Ilość plików \$Restores[\$i]{nFiles}
    Całkowity rozmiar \${MB} MB
    Szybkość transferu \$MBperSec MB/sec
    Błędy TarCreate \$Restores[\$i]{tarCreateErrs}
    Błędy Xfer \$Restores[\$i]{xferErrs}
    Plik dziennika Xfer Widok, Błędy

    \${h1("Lista plików/katalogów")}

    \$fileListStr
    Orginalny plik/katalogPrzywrócony na
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Detale Archiwum nr #\$num dla \$host"; $Lang{Archive___num_details_for__host2} = <
    Numer \$Archives[\$i]{num}
    Żądane przez \$ArchiveReq{user}
    Czas żądania \$reqTime
    Wynik \$Archives[\$i]{result}
    Wiadomość błędu \$Archives[\$i]{errorMsg}
    Czas rozpoczęcia \$startTime
    Czas trwania \$duration min
    Plik dziennika Xfer Widok, Błędy

    \${h1("Lista Hostów")}

    \$HostListStr
    HostNumer Kopii
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Podsumowanie emailów"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: sprawdź apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Zly użytkownik: mój userid to \$>, a nie \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Tylko uprzywilejowani użytkownicy mogą przegladać podsumowania."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Tylko uprzywilejowani użytkownicy mogą dokonywać kopii na \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Zły numer \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Niemozna otworzyć \$file: problem z konfiguracja ?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Tylko uprzywilejowani użytkownicy mogą przeglądac logi/pliki konf."; $Lang{Only_privileged_users_can_view_log_files} = "Tylko uprzywilejowani użytkownicy mogą przeglądać logi."; $Lang{Only_privileged_users_can_view_email_summaries} = "Tylko uprzywilejowani użytkownicy mogą przeglądać podsumowania emaili."; $Lang{Only_privileged_users_can_browse_backup_files} = "Tylko uprzywilejowani użytkownicy mogą przeglądać pliki kopii for host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Pusta nazwa hosta."; $Lang{Directory___EscHTML} = "Adres \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} jest pusty"; $Lang{Can_t_browse_bad_directory_name2} = "Nie można przeglądać - zła nazwa \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Tylko uprzywilejowani użytkownicy mogą przywracać pliki kopii dla hosta \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Zła nazwa hosta \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Nie zaznaczyłeś zadnych plików; proszę cofnąć sie do zaznaczanych plików."; $Lang{You_haven_t_selected_any_hosts} = "Nie zaznaczyłeś zadnego hosta; proszę cofnij sie i zaznacz odpowiednie hosty."; $Lang{Nice_try__but_you_can_t_put} = "Nieźle , ale nie możesz umieścic \'..\' w nazwie pliku"; $Lang{Host__doesn_t_exist} = "Host \${EscHTML(\$In{hostDest})} nie istnieje"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Nie masz uprawnień do przywracania danych na host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Nie można otworzyć/stworzyć\${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Tylko uprzywilejowani użytkownicy mogą przywracać pliki kopii dla hosta \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Pusta nazwa hosta"; $Lang{Unknown_host_or_user} = "Nieznany host albo uzytwkonik \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Tylko uprzywilejowani użytkownicy mogą przeglądać informacje o host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Tylko uprzywilejowani użytkownicy mogą przeglądać informacje o archiwum."; $Lang{Only_privileged_users_can_view_restore_information} = "Tylko uprzywilejowani użytkownicy mogą przeglądać przywracać informacje."; $Lang{Restore_number__num_for_host__does_not_exist} = "Punkt przywracania nr \$num dla hosta \${EscHTML(\$host)} nie istnieje."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archiwum numer \$num dla hosta \${EscHTML(\$host)} nie istnieje."; $Lang{Can_t_find_IP_address_for} = "Nie moge znaleść adresu IP dla \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Dopuki \$host jest adresem DHCP, możesz rozpocząć to źądanie bezpośrednio z tejże maszyny. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Kopia zaźądana na hoscie DHCP \$host (\$In{hostIP}) przez \$User z \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Kopia zażądana na \$host przez \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Kopia przerwana na \$host przez \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Przywrócenie na host \$hostDest, kopii nr #\$num, przez \$User z \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archiwum żądane przez \$User z \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Status"; $Lang{PC_Summary} = "Podsumowanie hostów"; $Lang{LOG_file} = "Plik Log"; $Lang{LOG_files} = "Pliki Log"; $Lang{Old_LOGs} = "Stare Logi"; $Lang{Email_summary} = "Podsumowanie emaili"; $Lang{Config_file} = "Plik Konfiguracyjny"; # $Lang{Hosts_file} = "Plik Hostów"; $Lang{Current_queues} = "Aktualne kolejki"; $Lang{Documentation} = "Dokumentacja"; #$Lang{Host_or_User_name} = "Host lub nazwa użytkownika:"; $Lang{Go} = "Idź"; $Lang{Hosts} = "Hosty"; $Lang{Select_a_host} = "Wybierz host..."; $Lang{There_have_been_no_archives} = "

    Nie było żadnej archiwizacji

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Ten PC nie byl nikty backupowany!!

    \n"; $Lang{This_PC_is_used_by} = "
  • Ten PC jest używany przez \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Błędy wypakowywania)"; $Lang{XferLOG} = "XferLOG"; $Lang{Errors} = "Błędy"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Ostatni email wysÅ‚any do \${UserLink(\$user)} byl o \$mailTime, subject "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Polecenie \$cmd jest aktualnie wykonywane dla \$host, rozpoczÄ™te o \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Host \$host jest zakolejkowany (kopia zostanie wykonana niedÅ‚ugo). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Host \$host jest zakolejkowany w kolejce użytkownika (kopia zostanie wykonana niedÅ‚ugo). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Polecenie dla \$host jest w kolejce poleceÅ„ (ruszy niedÅ‚ugo). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Ostatni status \"\$Lang->{\$StatusHost{state}}\"\$reason od \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <Ostatni błąd to \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Pingowanie \$host niepowidÅ‚o siÄ™ \$StatusHost{deadCnt} razy. EOF # ----- $Lang{Prior_to_that__pings} = "Poprzednio, "; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr pingów do \$host zakoÅ„czyÅ‚o siÄ™ sukcesem \$StatusHost{aliveCnt} razy. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Ponieważ \$host jest w sieci od co najmniej \$Conf{BlackoutGoodCnt} razy, nie zostanie utworzona kopia bezpieczeÅ„stwa \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 on \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Kopie zostaÅ‚y odÅ‚ożone na \$hours godzin (zmieÅ„ ten numer). EOF $Lang{tryIP} = " i \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Select all EOF $Lang{checkAllHosts} = <  Select all EOF $Lang{fileHeader} = < Nazwa Typ Tryb nr# Rozmiar Data modyfikacji EOF $Lang{Home} = "Dom"; $Lang{Browse} = "przeglÄ…daj kopie"; $Lang{Last_bad_XferLOG} = "Ostatni zÅ‚y XferLOG"; $Lang{Last_bad_XferLOG_errors_only} = "Ostatni zÅ‚y XferLOG (tylko bÅ‚edy)"; $Lang{This_display_is_merged_with_backup} = < ten display zostal zÅ‚oÅ„czony z kopiÄ… nr #\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Wybierz kopiÄ™ którÄ… chcesz przeglÄ…dać: EOF $Lang{Restore_Summary} = < Kliknij na numer przywrócenia dla informacji. \$restoreStr
    Nr przywrócenia# Wynik Data początku Trwanie/min Ilość plików MB Ilość błędów tar Ilość błędów xferErrs

    EOF $Lang{Archive_Summary} = < Kliknij na numerze archiwum dla informacji \$ArchiveStr
    Nr Archiwum wynik Data poczÄ…tku Trwanie/min

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Dokumentacja"; $Lang{No} = "nie"; $Lang{Yes} = "tak"; $Lang{The_directory_is_empty} = <Ten katalog jest \$dirDisplay pusty EOF #$Lang{on} = "wł"; $Lang{off} = "wył"; $Lang{backupType_full} = "pełen"; $Lang{backupType_incr} = "inkr"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "cząstwkowy"; $Lang{failed} = "nieudany"; $Lang{success} = "udany"; $Lang{and} = "oraz"; # ------ # Hosts states and reasons $Lang{Status_idle} = "bezczynny"; $Lang{Status_backup_starting} = "kopia w drodze"; $Lang{Status_backup_in_progress} = "kopia w trakcie tworzenia"; $Lang{Status_restore_starting} = "przywracanie w drodze"; $Lang{Status_restore_in_progress} = "przywracanie w trakcie tworzenia"; $Lang{Status_admin_pending} = "link wtrakcie"; $Lang{Status_admin_running} = "link działa"; $Lang{Reason_backup_done} = "zrobione"; $Lang{Reason_restore_done} = "przywracanie zrobione"; $Lang{Reason_archive_done} = "archiwum zrobione"; $Lang{Reason_nothing_to_do} = "bezczynny"; $Lang{Reason_backup_failed} = "kopia nieudana"; $Lang{Reason_restore_failed} = "przywracanie nieudane"; $Lang{Reason_archive_failed} = "archiwizacja nieudana"; $Lang{Reason_no_ping} = "nie ma pingu"; $Lang{Reason_backup_canceled_by_user} = "kopia przerwana przez użytwkonika"; $Lang{Reason_restore_canceled_by_user} = "przywracanie przerwane przez użytkownika"; $Lang{Reason_archive_canceled_by_user} = "archiwum przerwane przez użytwkonika"; $Lang{Disabled_OnlyManualBackups} = "automat wyłączony"; $Lang{Disabled_AllBackupsDisabled} = "wyłączony"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: żadna kopia \$host niepowiodła się"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; Do: $user$domain cc: Temat: $subj $headers Drogi $userName, Twoj PC ($host) nigdy nie został zabespieczony przez nasz program tworzenia kopii bezpieczeństwa. Backup powinien nastąpic automatycznie kiedy twoj PC zostanie podłączony do sieci. Powinieneś skontaktować się z pomocą techniczną jeżeli: - Twój PC jest cały czas podłączony , co oznacza ze wysteuje problem z konfiguracją uniemożliwiający tworzenie kopii. - Nie chcesz aby kopie były wykonywane i nie chcesz tych wiadomośći. Inaczej, proszę sprawdzić czy twój PC jest podłączony do sieci nastepnym razem kiedy bedziesz przy nim. Pozdrawiam , Czarodziej BackupPC https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: żadnych nowych kopii na \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; Do: $user$domain cc: Temat: $subj $headers Drogi $userName, Twój PC ($host) nie był pomyślnie zarchiwizowany przez $days dni. Twój PC był poprawnie zarchiwizowany $numBackups razy, od $firstTime do $days temu. Wykonywanie kopii bezpieczeństwa powinno nastąpić automatycznie po podłączeniu do śieci. Jeżeli twoj PC był podłączony więcej niż kilka godzin do sieci w czasie ostatnich $days dni powinieneś skontaktować sie z pomocą techniczą czemu twoje kopie nie działają. Inaczej , jeżeli jestes poza miejscem pracy nie możesz zrobić więcej niz skopiować samemu najważniejsze dane na odpowiedni nośnik. Musisz wiedzieć ze wszystkie pliki które stworzyłeś lub zmieniłeś przez ostatnie $days dni (włącznie z nowymi emailami i załącznikami) nie będą przywrócone jeżeli dysk ulegnie awarii. Pozdrowienia, Czarodziej BackupPC https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlook files on \$host need to be backed up"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "utworzenie kopii nie zostało zakonczone pomyślnie"; $Lang{howLong_not_been_backed_up_for_days_days} = "Kopia nie była tworzona od \$days dni"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "Serwer BackupPC"; $Lang{RSS_Doc_Description} = "Kanał RSS dla BackupPC"; $Lang{RSS_Host_Summary} = < Notka: Sprawdź opcję "Nadpisz" jeżeli chcesz zmienić wartość specificzną dla tego hosta.

    EOF $Lang{CfgEdit_Button_Save} = "Zapisz"; $Lang{CfgEdit_Button_Insert} = "Wstaw"; $Lang{CfgEdit_Button_Delete} = "Kasuj"; $Lang{CfgEdit_Button_Add} = "Dodaj"; $Lang{CfgEdit_Button_Override} = "Nadpisz"; $Lang{CfgEdit_Button_New_Key} = "Nowy Klucz"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Błąd: Nie zapisano z powodu błędów"; $Lang{CfgEdit_Error__must_be_an_integer} = "Błąd: \$var musi być liczbÄ… caÅ‚kowitÄ…"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Błąd: \$var musi być liczbÄ… rzeczywistÄ…"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Błąd: \$var wpis \$k musi być liczbÄ… caÅ‚kowitÄ…"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Błąd: \$var wpis \$k musi być liczbÄ… rzeczywistÄ…"; $Lang{CfgEdit_Error__must_be_executable_program} = "Błąd: \$var musi być poprawnÄ… Å›cieżkÄ… do programu wykonywalnego"; $Lang{CfgEdit_Error__must_be_valid_option} = "Błąd: \$var musi być poprawnÄ… opcjÄ…"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Kopiowany host \$copyHost nie istnieje; tworzÄ™ nowÄ… nazwÄ™ \$fullHost. Skasuj jÄ… jeżeli to nie to co chciaÅ‚eÅ›."; $Lang{CfgEdit_Log_Copy_host_config} = "Skopiowano konfiguracjÄ™ \$User z \$fromHost do \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User skasowany \$p z \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User dodany \$p do \$conf, ustawiono \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User zmieniony \$p w \$conf na \$valueNew z \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User skasowaÅ‚ host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User z hosta \$host zmieniÅ‚ \$key z \$valueOld na \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User dodaÅ‚ host \$host: \$value\n"; #end of lang_en.pm BackupPC-4.4.0/lib/BackupPC/Lang/ru.pm0000444000047500004750000020516513673511776016203 0ustar craigcraig#!/usr/bin/perl # # by Sergei Butakov (2011-05-1x - 2011-05-2x for V3.2.1) # # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Ðачать Ðрхивирование"; $Lang{Stop_Dequeue_Archive} = "ОÑтановить/Убрать из Очереди"; $Lang{Start_Full_Backup} = "Ðачать Полн. Копирование"; $Lang{Start_Incr_Backup} = "Ðачать Инкр. Копирование"; $Lang{Stop_Dequeue_Backup} = "ОÑтановить/Убрать из Очереди"; $Lang{Restore} = "ВоÑÑтановить"; $Lang{Type_full} = "полн."; $Lang{Type_incr} = "инкр."; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Only privileged users can view admin options."; $Lang{H_Admin_Options} = "BackupPC Server: Admin Options"; $Lang{Admin_Options} = "ÐдминиÑтрирование"; $Lang{Admin_Options_Page} = < \${h2("Управление Сервером")}

    Перезагрузить наÑтройки Ñервера:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Ðе могу подключитьÑÑ Ðº Ñерверу BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < The error was: \$err.
    Perhaps the BackupPC server is not running or there is a configuration error. Please report this to your Sys Admin. EOF $Lang{Admin_Start_Server} = < The BackupPC server at \$Conf{ServerHost} port \$Conf{ServerPort} is not currently running (maybe you just stopped it, or haven't yet started it).
    Do you want to start it? EOF # ----- $Lang{H_BackupPC_Server_Status} = "СоÑтоÑние Сервера BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • PID Ñервера \$Info{pid}, верÑÐ¸Ñ \$Info{Version}, запущен \$serverStartTime на узле \$Conf{ServerHost}.
  • Данный отчёт был Ñформирован \$now.
  • ÐаÑтройки поÑледний раз загружалиÑÑŒ \$configLoadTime.
  • Ð’ Ñледующий раз ПК будут поÑтавлены в очередь запроÑов \$nextWakeupTime.
  • ÐŸÑ€Ð¾Ñ‡Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:
    • \$numBgQueue запроÑов в очереди на резервирование (Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° поÑледнего запуÑка планировщика);
    • \$numUserQueue запроÑов в пользовательÑкой очереди на резервирование;
    • \$numCmdQueue запроÑов в очереди на выполнение команд; \$poolInfo
    • Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема пула занÑта на \$Info{DUlastValue}% (\$DUlastTime), ÑегоднÑшний макÑимум \$Info{DUDailyMax}% (\$DUmaxTime), вчерашний макÑимум \$Info{DUDailyMaxPrev}%.
    • Inode Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема пула занÑта на \$Info{DUInodelastValue}% (\$DUlastTime), ÑегоднÑшний макÑимум \$Info{DUInodeDailyMax}% (\$DUInodemaxTime), вчерашний макÑимум \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Работы, выполнÑемые в данный момент времени")}

    \$jobStr
    Узел Тип Пользователь Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Команда PID Xfer PID Status Count

    \$generalInfo \${h2("Сбои, нуждающиеÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ")}

    \$statusStr
    Узел Тип Пользователь ПоÑледнÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Детали Ð’Ñ€ÐµÐ¼Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¸ ПоÑледнÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° (не ÑÑ‡Ð¸Ñ‚Ð°Ñ Ð¾Ñ‚ÑутÑтвие \'пинга\')
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "Сводка по Узлам"; $Lang{BackupPC__Archive} = "Ðрхивирование"; $Lang{BackupPC_Summary} = <

    • Данный отчёт был Ñформирован \$now.
    • Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема пула занÑта на \$Info{DUlastValue}% (\$DUlastTime), ÑегоднÑшний макÑимум \$Info{DUDailyMax}% (\$DUmaxTime), вчерашний макÑимум \$Info{DUDailyMaxPrev}%.
    • Inode Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема пула занÑта на \$Info{DUInodelastValue}% (\$DUlastTime), ÑегоднÑшний макÑимум \$Info{DUInodeDailyMax}% (\$DUInodemaxTime), вчерашний макÑимум \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Узлы, имеющие резервные копии")}

    Ð’Ñего \$hostCntGood узлов, которые Ñодержат:

    • \$fullTot полных резервных копий общим размером \${fullSizeTot}GiB (до Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑжатиÑ);
    • \$incrTot инкрементальных резервных копий общим размером \${incrSizeTot}GiB (до Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑжатиÑ).

    \$strGood
    Узел Поль-ль Комментарий Кол-во ПОЛÐ. копий ПОЛÐ. возраÑÑ‚ (дни) ПОЛÐ. размер (ГБ) СкороÑть (МБ/Ñ) Кол-во ИÐКР. копий ИÐКР. возраÑÑ‚ (дни) ПоÑл. копир-ие (дни) СоÑтоÑние ТранÑп. ошибок ПоÑледнее дейÑтвие
    \${h2("Узлы, не имеющие резервные копии")}

    Ð’Ñего \$hostCntNone узлов, не имеющих резервных копий.

    \$strNone
    Узел Поль-ль Комментарий Кол-во ПОЛÐ. копий ПОЛÐ. возраÑÑ‚ (дни) ПОЛÐ. размер (ГБ) СкороÑть (МБ/Ñ) Кол-во ИÐКР. копий ИÐКР. возраÑÑ‚ (дни) ПоÑледн. копир-ие (дни) СоÑтоÑние ТранÑп. ошибок ПоÑледнее дейÑтвие
    EOF $Lang{BackupPC_Archive} = < Ð’Ñего \$hostCntGood узлов, чьи резервные копии занимают в общем \${fullSizeTot} ГБ.

    \$strGood \$checkAllHosts
    Узел Пользователь Размер Копии

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < РаÑположение/УÑтройÑтво Ðрхива EOF $Lang{BackupPC_Archive2_compression} = < Сжатие Ðет
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Percentage of Parity Data (0 = disable, 5 = typical) EOF $Lang{BackupPC_Archive2_split} = < Разделить на чаÑти по МБ EOF # ----------------------------------- $Lang{Pool_Stat} = <Пул занимает \${poolSize}GiB, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ \$info->{"\${name}FileCnt"} файлов и \$info->{"\${name}DirCnt"} каталогов (по данным на \$poolTime);
  • При хешировании пула произошло \$info->{"\${name}FileCntRep"} коллизии, макÑимальное количеÑтво файлов в одной коллизии - \$info->{"\${name}FileRepMax"};
  • Во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð¾Ñ‡Ð½Ð¾Ð¹ очиÑтки было удалено \$info->{"\${name}FileCntRm"} файлов общим размером \${poolRmSize}GiB (в районе \$poolTime); EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Backup Requested on \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Ответ Ñ Ñервера: \$reply

    ВернутьÑÑ Ð½Ð° Главную Ñтраницу узла \$host. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Start Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Резервное \$type копирование узла \$host.

    Ð’Ñ‹ уверены, что хотите Ñделать Ñто?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Stop Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < ОÑтановка/удаление из очереди узла \$host.
    Также, не начинать другое резервное копирование в течение чаÑов.

    Ð’Ñ‹ уверены, что хотите Ñделать Ñто?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Only privileged users can view queues."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Only privileged users can Archive."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Queue Summary"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Следующие запроÑÑ‹ находÑÑ‚ÑÑ Ð² очереди:

    \$strUser
    Узел Action Ð’Ñ€ÐµÐ¼Ñ Ð—Ð°Ð¿Ñ€Ð¾Ñа Пользователь
    \${h2("Очередь Фоновых Задач")}

    Следующие фоновые запроÑÑ‹ находÑÑ‚ÑÑ Ð² очереди:

    \$strBg
    Узел Action Ð’Ñ€ÐµÐ¼Ñ Ð—Ð°Ð¿Ñ€Ð¾Ñа Пользователь
    \${h2("Очередь Команд")}

    Следующие команды находÑÑ‚ÑÑ Ð² очереди:

    \$strCmd
    Узел Action Ð’Ñ€ÐµÐ¼Ñ Ð—Ð°Ð¿Ñ€Ð¾Ñа Пользователь Команда
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: File \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, Ñ Ð¿Ð¾Ñледними изменениÑми от \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ пропущено \$skipped Ñтрок ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nÐе могу открыть журнальный файл \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Log File History";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Файл Размер Ð’Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Получатель Узел Ð’Ñ€ÐµÐ¼Ñ Ð¢ÐµÐ¼Ð°
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Browse backup \$num for \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Restore Options for \$host"; $Lang{Restore_Options_for__host2} = < Ð’Ñ‹ выбрали Ñледующие файлы/каталоги из реÑурÑа \$share, номер копии â„– \$num:
      \$fileListStr

    Выберите один из трёх ÑпоÑобов воÑÑтановлениÑ.

    \${h2("СпоÑоб 1: ПрÑмое ВоÑÑтановление")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Внимание: вÑе ÑущеÑтвующие файлы, Ñовпадающие Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼Ð¸, будут перепиÑаны!

    \$hiddenStr
    ВоÑÑтановить на узел
    ВоÑÑтановить на реÑурÑ
    ВоÑÑтановить в каталог
    (отноÑительно реÑурÑа)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("СпоÑоб 2: Загрузка Zip-архива")}

    Ð’Ñ‹ можете загрузить Zip-архив, Ñодержащий вÑе выбранные файлы и каталоги. ПоÑле чего, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ðµ приложение, такое как WinZip, можно проÑмотреть или разархивировать любые файлы.

    Внимание: в завиÑимоÑти от выбранных Вами файлов/каталогов, Ñтот архив может быть очень очень большим. Ðа Ñоздание и передачу такого архива может уйти много времени, и Вам понадобитÑÑ Ð´Ð¾Ñтаточно много меÑта на локальном диÑке Ð´Ð»Ñ ÐµÐ³Ð¾ хранениÑ.

    \$hiddenStr Создать архив отноÑительно \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (в противном Ñлучае файлы в архиве будут иметь полные пути).
    Степень ÑÐ¶Ð°Ñ‚Ð¸Ñ (0=нет, 1=ÑÐ°Ð¼Ð°Ñ Ð±Ñ‹ÑтраÑ, ..., 9=ÑÐ°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Option 2: Download Zip archive")}

    Archive::Zip is not installed so you will not be able to download a zip archive. Please ask your system adminstrator to install Archive::Zip from www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Ð’Ñ‹ можете загрузить Tar-архив, Ñодержащий вÑе выбранные файлы и каталоги. ПоÑле чего, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ðµ приложение, такое как tar или WinZip, можно проÑмотреть или разархивировать любые файлы.

    Внимание: в завиÑимоÑти от выбранных Вами файлов/каталогов, Ñтот архив может быть очень очень большим. Ðа Ñоздание и передачу такого архива может уйти много времени, и Вам понадобитÑÑ Ð´Ð¾Ñтаточно много меÑта на локальном диÑке Ð´Ð»Ñ ÐµÐ³Ð¾ хранениÑ.

    \$hiddenStr Создать архив отноÑительно \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (в противном Ñлучае файлы в архиве будут иметь полные пути).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Restore Confirm on \$host"; $Lang{Are_you_sure} = < Следующие файлы будут воÑÑтановлены напрÑмую на узел \$In{hostDest} в реÑÑƒÑ€Ñ \$In{shareDest}, из резервной копии â„– \$num:

    \$fileListStr
    Оригинальный файл/каталогБудет воÑÑтановлен как

    \$hiddenStr Вы уверены?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Restore Requested on \$hostDest"; $Lang{Reply_from_server_was___reply} = < Ответ Ñ Ñервера: \$reply

    ВернутьÑÑ Ð½Ð° Главную Ñтраницу узла \$hostDest. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Ответ Ñ Ñервера: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Host \$host Backup Summary"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("ПользовательÑкие ДейÑтвиÑ")}

    \$startIncrStr

    \${h2("Сводка Резервного КопированиÑ")}

    Щёлкните по номеру Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñкопированных файлов.

    \$deleteHdrStr \$str
    â„– Тип Полный Уровень Дата Ðачала ДлительноÑть(мин) ВозраÑÑ‚(дни) Хранить Комментарий

    \$restoreStr

    \${h2("Сводка Ошибок при Копировании")} \$errStr
    â„– Тип Журнал ТранÑп. ошибок Плохих файлов РеÑурÑ. проблем tar ошибок
    \${h2("Сводка по Файлам")}

    СущеÑтвующие файлы - файлы, уже находÑщиеÑÑ Ð² пуле. Ðовые Ñто те, которые добавлены к пулу. ПуÑтые файлы не учитываютÑÑ. Empty files and SMB errors aren\'t counted in the reuse and new counts.

    \$sizeStr
    Ð’Ñего СущеÑтвующие Файлы Ðовые Файлы
    â„– Тип Файлов Размер(МБ) МБ/Ñ Ð¤Ð°Ð¹Ð»Ð¾Ð² Размер(МБ) Файлов Размер(МБ)
    \${h2("Сводка по Сжатию")}

    Степень ÑÐ¶Ð°Ñ‚Ð¸Ñ ÑущеÑтвующих и новых файлов.

    \$compStr
    СущеÑтвующие Файлы Ðовые Файлы
    â„– Тип Уровень Ð¡Ð¶Ð°Ñ‚Ð¸Ñ Ð Ð°Ð·Ð¼ÐµÑ€(МБ) Сжатый(МБ) Степень Ñж. Размер(МБ) Сжатый(МБ) Степень Ñж.
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archive Summary"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("ПользовательÑкие ДейÑтвиÑ")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Error"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Сервер"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • ÐšÐ¾Ð¿Ð¸Ñ â„– \$num, Ñоздание которой было начато примерно \$backupTime (\$backupAge дней назад), \$filledBackup
    • Введите каталог:
    • Комментарий:
    • Щёлкните на каталог, чтобы увидеть его Ñодержимое.
    • Щёлкните на файл, чтобы воÑÑтановить его.
    • ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹ текущего каталога. \$share2pathStr
    \${h2("Содержание каталога \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < СопоÑтавление имени общего реÑурÑа Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ñ‹Ð¼ клиентÑким путем (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Directory backup history for \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < ЗдеÑÑŒ показаны вÑе уникальные верÑии файлов, находÑщиеÑÑ Ð²Ð¾ вÑех резервных копиÑÑ…:
    • Щёлкните по номеру копии Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° к проÑмотру копии;
    • Щёлкните по ÑÑылке на каталог (\$Lang->{DirHistory_dirLink}) Ð´Ð»Ñ Ð·Ð°Ñ…Ð¾Ð´Ð° в Ñтот каталог;
    • Щёлкните по верÑии файла (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñтого файла;
    • Файлы из разных резервных копий, Ñодержащие одно и то же, имеют один и тот же номер верÑии (PleaseTranslateThis: except between v3 and v4 backups);
    • Файлы и каталоги, отÑутÑтвующие в конкретной копии, показаны пуÑтым прÑмоугольником;
    • Файлы одной верÑии могут отличатьÑÑ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ атрибутами файловой ÑиÑтемы. Выберите номер копии, чтобы поÑмотреть Ñти атрибуты.
    \${h2("ИÑÑ‚Ð¾Ñ€Ð¸Ñ \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Ðомер копии
    Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Restore #\$num details for \$host"; $Lang{Restore___num_details_for__host2} = <
    Ðомер \$Restores[\$i]{num}
    ЗапроÑил \$RestoreReq{user}
    Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа \$reqTime
    Результат \$Restores[\$i]{result}
    ТекÑÑ‚ ошибки \$Restores[\$i]{errorMsg}
    ИÑходÑщий узел \$RestoreReq{hostSrc}
    Ðомер иÑходÑщей копии \$RestoreReq{num}
    ИÑходÑщий реÑÑƒÑ€Ñ \$RestoreReq{shareSrc}
    Узел Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \$RestoreReq{hostDest}
    РеÑÑƒÑ€Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \$RestoreReq{shareDest}
    Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° \$startTime
    ПродолжительноÑть \$duration мин
    КоличеÑтво файлов \$Restores[\$i]{nFiles}
    Общий размер \${MB} МБ
    СкороÑть передачи \$MBperSec МБ/Ñ
    Ошибок при Ñоздании Tar \$Restores[\$i]{tarCreateErrs}
    Ошибок при передаче \$Restores[\$i]{xferErrs}
    Журнал ВеÑÑŒ, Только ошибки

    \${h1("СпиÑок Файлов/Каталогов")}

    \$fileListStr
    Оригинальный файл/каталогВоÑÑтановлен как
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Archive #\$num details for \$host"; $Lang{Archive___num_details_for__host2} = <
    Ðомер \$Archives[\$i]{num}
    ЗапроÑил \$ArchiveReq{user}
    Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа \$reqTime
    Результат \$Archives[\$i]{result}
    Сообщение об ошибке \$Archives[\$i]{errorMsg}
    Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка \$startTime
    ПродолжительноÑть \$duration min
    Журнал передачи данных ПроÑмотреть, Только ошибки

    \${h1("СпиÑок узлов")}

    \$HostListStr
    УзелÐомер резервной копии
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Email Summary"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: check apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Wrong user: my userid is \$>, instead of \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Only privileged users can view PC summaries."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Only privileged users can stop or start backups on \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Invalid number \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Unable to open \$file: configuration problem?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Only privileged users can view log or config files."; $Lang{Only_privileged_users_can_view_log_files} = "Only privileged users can view log files."; $Lang{Only_privileged_users_can_view_email_summaries} = "Only privileged users can view email summaries."; $Lang{Only_privileged_users_can_browse_backup_files} = "Only privileged users can browse backup files for host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Empty host name."; $Lang{Directory___EscHTML} = "Directory \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} is empty"; $Lang{Can_t_browse_bad_directory_name2} = "Ðе могу проÑмотреть каталог Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ названием \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Only privileged users can restore backup files for host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Bad host name \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Ð’Ñ‹ не выбрали ни один файл."; $Lang{You_haven_t_selected_any_hosts} = "You haven\'t selected any hosts; please go Back to select some hosts."; $Lang{Nice_try__but_you_can_t_put} = "Nice try, but you can\'t put \'..\' in any of the file names"; $Lang{Host__doesn_t_exist} = "Host \${EscHTML(\$In{hostDest})} doesn\'t exist"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "You don\'t have permission to restore onto host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Can\'t open/create \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Only privileged users can restore backup files for host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Empty host name"; $Lang{Unknown_host_or_user} = "ÐеизвеÑтный узел или пользователь \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Only privileged users can view information about host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Only privileged users can view archive information."; $Lang{Only_privileged_users_can_view_restore_information} = "Only privileged users can view restore information."; $Lang{Restore_number__num_for_host__does_not_exist} = "Restore number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archive number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Can_t_find_IP_address_for} = "Can\'t find IP address for \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Until I see \$host at a particular DHCP address, you can only start this request from the client machine itself. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Резервное копирование DHCP узла \$host (\$In{hostIP}) запроÑил \$User Ñ \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Резервное копирование узла \$host запроÑил \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Резервное копирование Ð´Ð»Ñ ÑƒÐ·Ð»Ð° \$host оÑтановил/убрал из очереди \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "ВоÑÑтановление на узел \$hostDest, копию â„– \$num, запроÑил \$User Ñ \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Ðрхивирование запроÑил \$User Ñ \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "СоÑтоÑние"; $Lang{PC_Summary} = "Сводка по Узлам"; $Lang{LOG_file} = "Журнал"; $Lang{LOG_files} = "Старые журналы"; $Lang{Old_LOGs} = "Старые журналы"; $Lang{Email_summary} = "Сводка по ПиÑьмам"; $Lang{Config_file} = "Config file"; # $Lang{Hosts_file} = "Hosts file"; $Lang{Current_queues} = "Сводка по ОчередÑм"; $Lang{Documentation} = "РуководÑтво"; #$Lang{Host_or_User_name} = "Host or User name:"; $Lang{Go} = "Ðайти"; $Lang{Hosts} = "Узлы"; $Lang{Select_a_host} = "Выбрать узел ..."; $Lang{There_have_been_no_archives} = "

    Ðрхивы отÑутÑтвуют

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Данный ПК ни разу не резервировалÑÑ!!

    \n"; $Lang{This_PC_is_used_by} = "
  • Данный ПК иÑпользует \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Выбраны только ошибки)"; $Lang{XferLOG} = "ВеÑÑŒ"; $Lang{Errors} = "Только Ошибки"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <ПоÑледнее пиÑьмо было отправлено \$mailTime, Ñ Ñ‚ÐµÐ¼Ð¾Ð¹ "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Команда \$cmd выполнÑетÑÑ Ð´Ð»Ñ ÑƒÐ·Ð»Ð° \$host, запущена \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Узел \$host поÑтавлен в фоновую очередь (Ñкоро будет запущено резервное копирование). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Узел \$host поÑтавлен в пользовательÑкую очередь (Ñкоро будет запущено резервное копирование). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Команда Ð´Ð»Ñ ÑƒÐ·Ð»Ð° \$host поÑтавлена в очередь команд (Ñкоро будет запущена). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <СоÑтоÑние \"\$Lang->{\$StatusHost{state}}\"\$reason на \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <ПоÑледнÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <"Пропинговать" узел \$host не удалоÑÑŒ \$StatusHost{deadCnt} раз(а) подрÑд. EOF # ----- $Lang{Prior_to_that__pings} = "Prior to that, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr to \$host были уÑпешны \$StatusHost{aliveCnt} раз(а) подрÑд. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Because \$host has been on the network at least \$Conf{BlackoutGoodCnt} consecutive times, it will not be backed up from \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 on \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Backups are deferred for \$hours hours (change this number). EOF $Lang{tryIP} = " and \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Ð’ыбрать вÑÑ‘ EOF $Lang{checkAllHosts} = <  Ð’ыбрать вÑÑ‘ EOF $Lang{fileHeader} = < Ðазвание Тип Права â„– Размер Дата Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ EOF $Lang{Home} = "ГлавнаÑ"; $Lang{Browse} = "ПроÑмотр резервной копии"; $Lang{Last_bad_XferLOG} = "ПоÑледний журнал Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸"; $Lang{Last_bad_XferLOG_errors_only} = "ПоÑледний журнал Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸ (только Ð¾ÑˆÐ¸Ð±ÐºÐ¸)"; $Lang{This_display_is_merged_with_backup} = < Данное отображение объединено Ñ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ â„– \$numF. EOF $Lang{Visit_this_directory_in_backup} = < Выберите номер копии Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра: EOF $Lang{Restore_Summary} = < Щёлкните по номеру Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ детального проÑмотра. \$restoreStr
    â„– Результат Дата начала ДлительноÑть(мин) Кол-во файлов Размер(МБ) tar ошибок ТранÑп. ошибок

    EOF $Lang{Archive_Summary} = < Щёлкните по номеру архива Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ детального проÑмотра. \$ArchiveStr
    â„– Результат Ð’Ñ€ÐµÐ¼Ñ Ð—Ð°Ð¿ÑƒÑка ПродолжительноÑть(мин)

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentation"; $Lang{No} = "нет"; $Lang{Yes} = "да"; $Lang{The_directory_is_empty} = <The directory \$dirDisplay is empty EOF #$Lang{on} = "on"; $Lang{off} = "откл."; $Lang{backupType_full} = "полн."; $Lang{backupType_incr} = "инкр."; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "чаÑтичный"; $Lang{failed} = "неудачно"; $Lang{success} = "уÑпешно"; $Lang{and} = "и"; # ------ # Hosts states and reasons $Lang{Status_idle} = "бездейÑтвует"; $Lang{Status_backup_starting} = "началоÑÑŒ копирование"; $Lang{Status_backup_in_progress} = "в процеÑÑе копированиÑ"; $Lang{Status_restore_starting} = "началоÑÑŒ воÑÑтановление"; $Lang{Status_restore_in_progress} = "в процеÑÑе воÑÑтановлениÑ"; $Lang{Status_admin_pending} = "link pending"; $Lang{Status_admin_running} = "link running"; $Lang{Reason_backup_done} = "копирование закончено"; $Lang{Reason_restore_done} = "воÑÑтановление закончено"; $Lang{Reason_archive_done} = "архивирование закончено"; $Lang{Reason_nothing_to_do} = "без работы"; $Lang{Reason_backup_failed} = "копирование не удалоÑÑŒ"; $Lang{Reason_restore_failed} = "воÑÑтановление не удалоÑÑŒ"; $Lang{Reason_archive_failed} = "архивирование не удалоÑÑŒ"; $Lang{Reason_no_ping} = "не \'пингуетÑÑ\'"; $Lang{Reason_backup_canceled_by_user} = "копирование прервано пользователем"; $Lang{Reason_restore_canceled_by_user} = "воÑÑтановление прервано пользователем"; $Lang{Reason_archive_canceled_by_user} = "воÑÑтановление прервано пользователем"; $Lang{Disabled_OnlyManualBackups} = "автозапрет"; $Lang{Disabled_AllBackupsDisabled} = "запрещено"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: no backups of \$host have succeeded"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has never been successfully backed up by our PC backup software. PC backups should occur automatically when your PC is connected to the network. You should contact computer support if: - Your PC has been regularly connected to the network, meaning there is some configuration or setup problem preventing backups from occurring. - You don't want your PC backed up and you want these email messages to stop. Otherwise, please make sure your PC is connected to the network next time you are in the office. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: no recent backups on \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has not been successfully backed up for $days days. Your PC has been correctly backed up $numBackups times from $firstTime to $days days ago. PC backups should occur automatically when your PC is connected to the network. If your PC has been connected for more than a few hours to the network during the last $days days you should contact IS to find out why backups are not working. Otherwise, if you are out of the office, there's not much you can do, other than manually copying especially critical files to other media. You should be aware that any files you have created or changed in the last $days days (including all new email and attachments) cannot be restored if your PC disk crashes. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlook files on \$host need to be backed up"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "not been backed up successfully"; $Lang{howLong_not_been_backed_up_for_days_days} = "not been backed up for \$days days"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < Примечание: ПоÑтавьте галочку Ñ€Ñдом Ñ "Заменить", еÑли хотите изменить значение параметра индивидуально Ð´Ð»Ñ Ñтого узла.

    EOF $Lang{CfgEdit_Button_Save} = "Сохранить"; $Lang{CfgEdit_Button_Insert} = "Ð’Ñтавить"; $Lang{CfgEdit_Button_Delete} = "Удалить"; $Lang{CfgEdit_Button_Add} = "Добавить"; $Lang{CfgEdit_Button_Override} = "Заменить"; $Lang{CfgEdit_Button_New_Key} = "New Key"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Ошибка: не Ñохранено из-за Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"; $Lang{CfgEdit_Error__must_be_an_integer} = "Ошибка: \$var должно быть целым чиÑлом"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Ошибка: \$var должно быть дейÑтвительным чиÑлом"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Ошибка: \$var Ñлемент \$k должен быть целым чиÑлом"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Ошибка: \$var Ñлемент \$k должен быть дейÑтвительным чиÑлом"; $Lang{CfgEdit_Error__must_be_executable_program} = "Ошибка: \$var должно быть дейÑтвительным путём иÑполнÑемой программы"; $Lang{CfgEdit_Error__must_be_valid_option} = "Ошибка: \$var должно быть допуÑтимой опцией"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Копируемый узел \$copyHost отÑутÑтвует, ÑоздаётÑÑ ÑƒÐ·ÐµÐ» \$fullHost. Удалите Ñтот узел, еÑли Ñто не то, что Вам требуетÑÑ."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User copied config from host \$fromHost to \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User deleted \$p from \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User added \$p to \$conf, set to \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User changed \$p in \$conf to \$valueNew from \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User deleted host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host changed \$key from \$valueOld to \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User added host \$host: \$value\n"; #end of ru.pm BackupPC-4.4.0/lib/BackupPC/Lang/fr.pm0000444000047500004750000017256313673511776016171 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Démarrer l'archivage"; $Lang{Stop_Dequeue_Archive} = "Arrêt/Mise en attente de l'archivage"; $Lang{Start_Full_Backup} = "Démarrer la sauvegarde complète"; $Lang{Start_Incr_Backup} = "Démarrer la sauvegarde incrémentielle"; $Lang{Stop_Dequeue_Backup} = "Arrêter/annuler la sauvegarde"; $Lang{Restore} = "Restaurer"; $Lang{Type_full} = "complète"; $Lang{Type_incr} = "incrémentielle"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Seuls les utilisateurs privilégiés peuvent voir les options d'administration."; $Lang{H_Admin_Options} = "BackupPC: Options d'administration"; $Lang{Admin_Options} = "Options d'administration"; $Lang{Admin_Options_Page} = < \${h2("Contrôle du serveur")}

    Recharger la configuration:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Impossible de se connecter au serveur BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < L'erreur est: \$err.
    Il est possible que le serveur BackupPC ne fonctionne pas actuellement ou qu'il y ait une erreur de configuration. Veuillez contacter votre administrateur système. EOF $Lang{Admin_Start_Server} = < Le serveur BackupPC sur \$Conf{ServerHost}, port \$Conf{ServerPort} n'est pas en fonction (vous l'avez peut-être arrêté, ou vous ne l'avez pas encore démarré).
    Voulez-vous le démarrer ? EOF # ----- $Lang{H_BackupPC_Server_Status} = "État du serveur BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • Le PID du serveur est \$Info{pid}, sur l\'hôte \$Conf{ServerHost}, version \$Info{Version}, démarré le \$serverStartTime.
  • Ce rapport a été généré le \$now.
  • La configuration a été chargée pour la dernière fois à \$configLoadTime.
  • La prochaine file d\'attente sera remplie à \$nextWakeupTime.
  • Autres infos:
    • \$numBgQueue demandes de sauvegardes en attente depuis le dernier réveil automatique,
    • \$numUserQueue requêtes de sauvegardes utilisateur en attente,
    • \$numCmdQueue requêtes de commandes en attente, \$poolInfo
    • L\'espace de stockage a été récemment rempli à \$Info{DUlastValue}% (\$DUlastTime), le maximum aujourd\'hui a été de \$Info{DUDailyMax}% (\$DUmaxTime) et hier le maximum était de \$Info{DUDailyMaxPrev}%.
    • Inode L\'espace de stockage a été récemment rempli à \$Info{DUInodelastValue}% (\$DUlastTime), le maximum aujourd\'hui a été de \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) et hier le maximum était de \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Travaux en cours d'exécution")}

    \$jobStr
    Hôte Type Utilisateur Date de départ Commande PID PID du transfert Status Count

    \$generalInfo \${h2("Échecs qui demandent de l'attention")}

    \$statusStr
    Hôte Type Utilisateur Dernier essai Détails Date d\'erreur Dernière erreur (autre que pas de ping)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Bilan des machines"; $Lang{BackupPC__Archive} = "BackupPC: Archivage"; $Lang{BackupPC_Summary} = <

    • Ce statut a été généré le \$now.
    • L\'espace de stockage a été récemment rempli à \$Info{DUlastValue}% (\$DUlastTime), le maximum aujourd\'hui a été de \$Info{DUDailyMax}% (\$DUmaxTime) et hier le maximum était de \$Info{DUDailyMaxPrev}%.
    • Inode L\'espace de stockage a été récemment rempli à \$Info{DUInodelastValue}% (\$DUlastTime), le maximum aujourd\'hui a été de \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) et hier le maximum était de \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hôtes avec de bonnes sauvegardes")}

    Il y a \$hostCntGood hôtes ayant été sauvegardés, pour un total de :

    • \$fullTot sauvegardes complètes de tailles cumulées de \${fullSizeTot} Go (précédant la mise en commun et la compression),
    • \$incrTot sauvegardes incrémentielles de tailles cumulées de \${incrSizeTot} Go (précédant la mise en commun et la compression).

    \$strGood
    Hôte Utilisateur Commentaire Nb complètes Complètes Âge (jours) Complètes Taille (Go) Vitesse (Mo/s) Nb incrémentielles Incrémentielles Âge (jours) Dernière sauvegarde (jours) État actuel Nb erreurs transfert Dernière tentative
    \${h2("Hôtes sans sauvegardes")}

    Il y a \$hostCntNone hôtes sans sauvegardes.

    \$strNone
    Hôte Utilisateur Commentaire Nb complètes Complètes Âge (jours) Complètes Taille (Go) Vitesse (Mo/s) Nb incrémentielles Incrémentielles Âge (jours) Dernière sauvegarde (jours) État actuel Nb erreurs transfert Dernière tentative
    EOF $Lang{BackupPC_Archive} = < Il y a \$hostCntGood hôtes qui ont été sauvegardés, représentant \${fullSizeTot} Go

    \$strGood \$checkAllHosts
    Host Utilisateur Taille

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Dispositif/Localisation de l'archive EOF $Lang{BackupPC_Archive2_compression} = < Compression Aucune
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Pourcentage des données de parité (0 = désactivé, 5 = typique) EOF $Lang{BackupPC_Archive2_split} = < Scinder le fichier en fichiers de Mo EOF # ----------------------------------- $Lang{Pool_Stat} = <La mise en commun est constituée de \$info->{"\${name}FileCnt"} fichiers et \$info->{"\${name}DirCnt"} répertoires représentant \${poolSize} Go (depuis le \$poolTime),
  • Le hachage de mise en commun des fichiers donne \$info->{"\${name}FileCntRep"} fichiers répétés avec comme plus longue chaîne \$info->{"\${name}FileRepMax"},
  • Le nettoyage nocturne a effacé \$info->{"\${name}FileCntRm"} fichiers, soit \${poolRmSize} Go (vers \$poolTime), EOF # ----------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Sauvegarde demandée sur \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < La réponse du serveur a été : \$reply

    Retourner à la page d\'accueil de \$host. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Confirmation du démarrage de la sauvegarde de \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Vous allez bientôt démarrer une sauvegarde \$type depuis \$host.

    Voulez-vous vraiment le faire ?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Confirmer l\'arrêt de la sauvegarde sur \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Vous êtes sur le point d\'arrêter/supprimer de la file les sauvegardes de \$host;
    En outre, prière de ne pas démarrer d\'autre sauvegarde pendant heures.

    Voulez-vous vraiment le faire ?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Seuls les utilisateurs privilégiés peuvent voir les files."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Seuls les utilisateurs privilégiés peuvent archiver."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Résumé de la file"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Les demandes utilisateurs suivantes sont actuellement en attente :

    \$strUser
    Hôte Action Temps Requis Utilisateur
    \${h2("Résumé de la file en arrière plan")}

    Les demandes en arrière plan suivantes sont actuellement en attente :

    \$strBg
    Hôte Action Temps requis Utilisateur
    \${h2("Résumé de la file d\'attente des commandes")}

    Les demandes de commande suivantes sont actuellement en attente :

    \$strCmd
    Hôtes Action Temps Requis Utilisateur Commande
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Fichier \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, modifié le \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ \$skipped lignes sautées ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nNe peut pas ouvrir le fichier journal \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Historique du fichier journal";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Fichier Taille Date de modification
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Destinataire Hôte Date Sujet
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Navigation dans la sauvegarde \$num de \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Options de restauration sur \$host"; $Lang{Restore_Options_for__host2} = < Vous avez sélectionné les fichiers/répertoires suivants depuis le partage \$share, sauvegarde numéro \$num:
      \$fileListStr

    Vous avez trois choix pour restaurer ces fichiers/répertoires. Veuillez sélectionner une des options suivantes.

    \${h2("Option 1: Restauration directe")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Attention: tous les fichiers correspondant à ceux que vous avez sélectionnés vont être écrasés !

    \$hiddenStr
    Restaure les fichiers vers l'hôte
    Restaurer les fichiers vers le partage
    Restaurer les fichiers du répertoire
    (relatif au partage)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Option 2: Télécharger une archive Zip")}

    Vous pouvez télécharger une archive compressée (.zip) contenant tous les fichiers/répertoires que vous avez sélectionnés. Vous pouvez utiliser une application locale, comme Winzip, pour voir ou extraire n\'importe quel fichier.

    Attention: en fonction des fichiers/répertoires que vous avez sélectionnés, cette archive peut devenir très très volumineuse. Cela peut prendre plusieurs minutes pour créer et transférer cette archive, et vous aurez besoin d\'assez d\'espace disque pour la stocker.

    \$hiddenStr Faire l\'archive relative à \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (Autrement l\'archive contiendra les chemins complets).
    Compression (0=désactivée, 1=rapide,...,9=meilleure)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Option 2: Télécharger une archive Zip")}

    Vous ne pouvez pas télécharger d'archive zip, car Archive::Zip n\'est pas installé. Veuillez demander à votre administrateur système d\'installer Archive::Zip depuis www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Vous pouvez télécharger une archive Tar contenant tous les fichiers/répertoires que vous avez sélectionnés. Vous pourrez alors utiliser une application locale, comme tar ou winzip pour voir ou extraire n\'importe quel fichier.

    Attention: en fonction des fichiers/répertoires que vous avez sélectionnés, cette archive peut devenir très très volumineuse. Cela peut prendre plusieurs minutes pour créer et transférer l\'archive, et vous aurez besoin d\'assez d\'espace disque local pour la stocker.

    \$hiddenStr Faire l\'archive relative à \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (Autrement l\'archive contiendra des chemins absolus).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Confirmation de restauration sur \$host"; $Lang{Are_you_sure} = < Vous êtes sur le point de démarrer une restauration directement sur la machine \$In{hostDest}. Les fichiers suivants vont être restaurés dans le partage \$In{shareDest}, depuis la sauvegarde numéro \$num:

    \$fileListStr
    Fichier/Répertoire originalVa être restauré à

    \$hiddenStr Voulez-vous vraiment le faire ?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Restauration demandée sur \$hostDest"; $Lang{Reply_from_server_was___reply} = < La réponse du serveur est : \$reply

    Retourner à la page d\'accueil de \$hostDest . EOF $Lang{BackupPC_Archive_Reply_from_server} = < La réponse du serveur est : \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Résumé de la sauvegarde de l\'hôte \$host "; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Actions de l\'utilisateur")}

    \$startIncrStr

    \${h2("Résumé de la sauvegarde")}

    Cliquer sur le numéro de l\'archive pour naviguer et restaurer les fichiers de sauvegarde.

    \$deleteHdrStr \$str
    Sauvegarde n° Type Fusionnée Niveau Date de démarrage Durée (min) Âge (jours) Garder Commentaire

    \$restoreStr

    \${h2("Résumé des erreurs de transfert")} \$errStr
    Sauvegarde n° Type Voir Nb erreurs transfert Nb mauvais fichiers Nb mauvais partages Nb erreurs tar
    \${h2("Récapitulatif de la taille des fichiers et du nombre de réutilisations")}

    Les fichiers existants sont ceux qui sont déjà sur le serveur; Les nouveaux fichiers sont ceux qui ont été ajoutés au serveur. Les fichiers vides et les erreurs de SMB ne sont pas comptabilisés dans les fichiers nouveaux ou réutilisés.

    \$sizeStr
    Totaux Fichiers existants Nouveaux fichiers
    Sauvegarde n° Type Nb de Fichiers Taille (Mo) Mo/s Nb de Fichiers Taille (Mo) Nb de Fichiers Taille (Mo)
    \${h2("Résumé de la compression")}

    Performance de la compression pour les fichiers déjà sur le serveur et récemment compressés.

    \$compStr
    Fichiers existants Nouveaux fichiers
    Nb de sauvegardes Type Niveau de Compression Taille (Mo) Taille compressée (Mo) Compression Taille (Mo) Taille compressée (Mo) Compression
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Résumé de l'archivage pour l'hôte \$host"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("User Actions")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Erreur"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Serveur"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Vous naviguez dans la sauvegarde n°\$num, qui a commencé vers \$backupTime (il y a \$backupAge jours), \$filledBackup
    • Entrez le répertoire:
    • Commentaire:
    • Cliquer sur un répertoire ci-dessous pour y naviguer,
    • Cliquer sur un fichier ci-dessous pour le restaurer,
    • Vous pouvez voir l'historique des différentes sauvegardes du répertoire courant. \$share2pathStr
    \${h2("Contenu de \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mappage du nom de partage sur le chemin client réel (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Historique des sauvegardes du répertoire courant pour \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "rep"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Cette page montre toutes les version disponibles des fichiers sauvegardés pour le répertoire courant :
    • Cliquez sur un numéro de sauvegarde pour revenir à la navigation de sauvegarde,
    • Cliquez sur un répertoire (\$Lang->{DirHistory_dirLink}) pour naviguer dans celui-ci.
    • Cliquez sur une version d'un fichier (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) pour le télécharger.
    • Les fichiers avec des contenus identiques pour plusieurs sauvegardes ont le même numéro de version, sauf entre des sauvegardes en v3 et v4.
    • Les fichiers qui ne sont pas présents sur une sauvegarde en particulier sont représentés par une boîte vide.
    • Les fichiers montrés avec la même version peuvent avoir des attributs différents. Choisissez le numéro de sauvegarde pour voir les attributs de fichiers.
    \${h2("Historique de \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Numéro de sauvegarde
    Date
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Détails de la restauration n°\$num pour \$host"; $Lang{Restore___num_details_for__host2} = <
    Numéro \$Restores[\$i]{num}
    Demandée par \$RestoreReq{user}
    Demandée à \$reqTime
    Résultat \$Restores[\$i]{result}
    Message d'erreur \$Restores[\$i]{errorMsg}
    Hôte source \$RestoreReq{hostSrc}
    N° de sauvegarde \$RestoreReq{num}
    Partition source \$RestoreReq{shareSrc}
    Hôte de destination \$RestoreReq{hostDest}
    Partition de destination \$RestoreReq{shareDest}
    Début \$startTime
    Durée \$duration min
    Nombre de fichiers \$Restores[\$i]{nFiles}
    Taille totale \${MB} Mo
    Taux de transfert \$MBperSec Mo/s
    Erreurs de TarCreate \$Restores[\$i]{tarCreateErrs}
    Erreurs de transfert \$Restores[\$i]{xferErrs}
    Journal de transfert Visionner, Erreurs

    \${h1("Liste des Fichiers/Répertoires")}

    \$fileListStr
    Fichier/répertoire originalRestauré vers
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Détails de l'archivage n°\$num pour \$host"; $Lang{Archive___num_details_for__host2} = <
    Numéro \$Archives[\$i]{num}
    Demandé par \$ArchiveReq{user}
    Heure de demande \$reqTime
    Résultat \$Archives[\$i]{result}
    Message d'erreur \$Archives[\$i]{errorMsg}
    Heure de début \$startTime
    Durée \$duration min
    Journal de transfert Voir, Erreurs

    \${h1("Liste de hôtes")}

    \$HostListStr
    HostNuméro de sauvegarde
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Résumé du courriel"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new a échoué: regardez le fichier error_log d\'apache\n"; $Lang{Wrong_user__my_userid_is___} = "Mauvais utilisateur: mon userid est \$>, à la place de \$uid (\$Conf{BackupPCUser})\n"; #$Lang{Only_privileged_users_can_view_PC_summaries} = "Seuls les utilisateurs privilégiés peuvent voir les résumés des machines."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Seuls les utilisateurs privilégiés peuvent arrêter ou démarrer des sauvegardes sur \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Numéro invalide \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Impossible d\'ouvrir \$file : problème de configuration ?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Seuls les utilisateurs privilégiés peuvent voir les fichiers de journal ou les fichiers de configuration."; $Lang{Only_privileged_users_can_view_log_files} = "Seuls les utilisateurs privilégiés peuvent voir les fichiers de journal."; $Lang{Only_privileged_users_can_view_email_summaries} = "Seuls les utilisateurs privilégiés peuvent voir les compte-rendus des courriels."; $Lang{Only_privileged_users_can_browse_backup_files} = "Seuls les utilisateurs privilégiés peuvent parcourir les fichiers de sauvegarde" . " pour l'hôte \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nom d\'hôte vide."; $Lang{Directory___EscHTML} = "Le répertoire \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} est vide"; $Lang{Can_t_browse_bad_directory_name2} = "Ne peut pas parcourir \${EscHTML(\$relDir)} : mauvais nom de répertoire"; $Lang{Only_privileged_users_can_restore_backup_files} = "Seuls les utilisateurs privilégiés peuvent restaurer " . " des fichiers de sauvegarde pour l\'hôte \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Mauvais nom d\'hôte \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Vous n\'avez sélectionné aucun fichier ; vous pouvez revenir en arrière pour sélectionner des fichiers."; $Lang{You_haven_t_selected_any_hosts} = "Vous n\'avez sélectionné aucun hôte ; veuillez retourner à la page précédente pour" . " faire la sélection d\'un hôte."; $Lang{Nice_try__but_you_can_t_put} = "Bien tenté, mais vous ne pouvez pas mettre \'..\' dans un nom de fichier."; $Lang{Host__doesn_t_exist} = "L'hôte \${EscHTML(\$In{hostDest})} n\'existe pas."; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Vous n\'avez pas la permission de restaurer sur l\'hôte \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Ne peut pas ouvrir/créer \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Seuls les utilisateurs privilégiés peuvent restaurer" . " des fichiers de sauvegarde pour l\'hôte \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nom d\'hôte vide"; $Lang{Unknown_host_or_user} = "\${EscHTML(\$host)}, hôte ou utilisateur inconnu."; $Lang{Only_privileged_users_can_view_information_about} = "Seuls les utilisateurs privilégiés peuvent accéder aux informations sur l\'hôte \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Seuls les utilisateurs privilégiés peuvent voir les informations d'archivage."; $Lang{Only_privileged_users_can_view_restore_information} = "Seuls les utilisateurs privilégiés peuvent restaurer des informations."; $Lang{Restore_number__num_for_host__does_not_exist} = "La restauration numéro \$num de l\'hôte \${EscHTML(\$host)} n\'existe pas"; $Lang{Archive_number__num_for_host__does_not_exist} = "L\'archive n°\$num pour l\'hôte \${EscHTML(\$host)} n\'existe pas."; $Lang{Can_t_find_IP_address_for} = "Ne peut pas trouver d\'adresse IP pour \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Tant que je ne verrai pas \$host à une adresse DHCP particulière, vous ne pourrez démarrer cette requête que depuis la machine elle même. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Demande de sauvegarde sur l\'hôte \$host (\$In{hostIP}) par \$User depuis \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Sauvegarde demandée sur \$host par \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Sauvegarde arrêtée/déprogrammée pour \$host par \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Restauration demandée pour l\'hôte \$hostDest, sauvegarde n°\$num, par \$User depuis \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivage demandé par \$User de \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "État"; $Lang{PC_Summary} = "Bilan des machines"; $Lang{LOG_file} = "Fichier journal"; $Lang{LOG_files} = "Fichiers journaux"; $Lang{Old_LOGs} = "Vieux journaux"; $Lang{Email_summary} = "Résumé des courriels"; $Lang{Config_file} = "Fichier de configuration"; # $Lang{Hosts_file} = "Fichiers des hôtes"; $Lang{Current_queues} = "Files actuelles"; $Lang{Documentation} = "Documentation"; #$Lang{Host_or_User_name} = "Hôte ou Nom d\'utilisateur:"; $Lang{Go} = "Chercher"; $Lang{Hosts} = "Hôtes"; $Lang{Select_a_host} = "Choisissez un hôte..."; $Lang{There_have_been_no_archives} = "

    Il n'y a pas d'archives

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Cette machine n'a jamais été sauvegardée !!

    \n"; $Lang{This_PC_is_used_by} = "
  • Cette machine est utilisée par \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Extraction des erreurs seulement)"; $Lang{XferLOG} = "JournalXfer"; $Lang{Errors} = "Erreurs"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Le dernier courriel envoyé à \${UserLink(\$user)} le \$mailTime, avait comme sujet "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <La commande \$cmd s\'exécute actuellement sur \$host, démarrée le \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <L\'hôte \$host se trouve dans la liste d\'attente d\'arrière plan (il sera sauvegardé bientôt). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <L\'hôte \$host se trouve dans la liste d\'attente utilisateur (il sera sauvegardé bientôt). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Une commande pour l\'hôte \$host est dans la liste d\'attente des commandes (sera lancée bientôt). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <L\'état courant est \"\$Lang->{\$StatusHost{state}}\"\$reason depuis \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <La dernière erreur est \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Les pings vers \$host ont échoué \$StatusHost{deadCnt} fois consécutives. EOF # ----- $Lang{Prior_to_that__pings} = "Avant cela, les pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <Les \$priorStr vers \$host ont réussi \$StatusHost{aliveCnt} fois consécutives. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <\$host a été présent sur le réseau au moins \$Conf{BlackoutGoodCnt} fois consécutives, il ne sera donc pas sauvegardé de \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 à \$t1 pendant \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Les sauvegardes sont reportées pour \$hours heures (changer ce nombre). EOF $Lang{tryIP} = " et \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Hôte \$In{host}"; $Lang{checkAll} = <  Tout sélectionner EOF $Lang{checkAllHosts} = <  Tout sélectionner EOF $Lang{fileHeader} = < Nom Type Mode n° Taille Date de modification EOF $Lang{Home} = "Accueil"; $Lang{Browse} = "Explorer les sauvegardes"; $Lang{Last_bad_XferLOG} = "Bilan des derniers transferts échoués"; $Lang{Last_bad_XferLOG_errors_only} = "Bilan des derniers transferts échoués (erreurs seulement)"; $Lang{This_display_is_merged_with_backup} = < Cet affichage est fusionné avec la sauvegarde n°\$numF, la plus récente copie intégrale. EOF $Lang{Visit_this_directory_in_backup} = < Choisissez la sauvegarde que vous désirez voir : EOF $Lang{Restore_Summary} = < Cliquer sur le numéro de restauration pour plus de détails. \$restoreStr
    Sauvegarde n° Résultat Date de départ Durée (min) Nb fichiers Taille (Mo) Nb errs tar Nb errs trans

    EOF $Lang{Archive_Summary} = < Cliquez sur le numéro de l'archive pour plus de détails. \$ArchiveStr
    No. Archive Résultat Date début Durée (min)

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentation"; $Lang{No} = "non"; $Lang{Yes} = "oui"; $Lang{The_directory_is_empty} = <Le répertoire \$dirDisplay est vide EOF #$Lang{on} = "actif"; $Lang{off} = "inactif"; $Lang{backupType_full} = "complète"; $Lang{backupType_incr} = "incrémentielle"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "partielle"; $Lang{failed} = "échec"; $Lang{success} = "succès"; $Lang{and} = "et"; # ------ # Hosts states and reasons $Lang{Status_idle} = "inactif"; $Lang{Status_backup_starting} = "début de la sauvegarde"; $Lang{Status_backup_in_progress} = "sauvegarde en cours"; $Lang{Status_restore_starting} = "début de la restauration"; $Lang{Status_restore_in_progress} = "restauration en cours"; $Lang{Status_admin_pending} = "en attente de l'édition de liens"; $Lang{Status_admin_running} = "édition de liens en cours"; $Lang{Reason_backup_done} = "sauvegarde terminée"; $Lang{Reason_restore_done} = "restauration terminée"; $Lang{Reason_archive_done} = "archivage terminé"; $Lang{Reason_nothing_to_do} = "rien à faire"; $Lang{Reason_backup_failed} = "la sauvegarde a échoué"; $Lang{Reason_restore_failed} = "la restauration a échoué"; $Lang{Reason_archive_failed} = "l'archivage a échoué"; $Lang{Reason_no_ping} = "pas de ping"; $Lang{Reason_backup_canceled_by_user} = "sauvegarde annulée par l'utilisateur"; $Lang{Reason_restore_canceled_by_user} = "restauration annulée par l'utilisateur"; $Lang{Reason_archive_canceled_by_user} = "archivage annulé par l'utilisateur"; $Lang{Disabled_OnlyManualBackups} = "auto désactivé"; $Lang{Disabled_AllBackupsDisabled} = "désactivé"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: aucune sauvegarde de \$host n'a réussi"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers $userName, Notre logiciel de copies de sécurité n'a jamais réussi à effectuer la sauvegarde de votre ordinateur ($host). Les sauvegardes devraient normalement survenir lorsque votre ordinateur est connecté au réseau. Vous devriez contacter le responsable informatique si : - Votre ordinateur est régulièrement connecté au réseau, ce qui signifie qu'il y aurait un problème de configuration empêchant les sauvegardes de s'effectuer. - Vous ne voulez pas qu'il y ait de sauvegardes de votre ordinateur ni ne voulez recevoir d'autres messages comme celui-ci. Dans le cas contraire, veuillez vous assurer dès que possible que votre ordinateur est correctement connecté au réseau. Merci de votre attention, BackupPC Génie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: aucune sauvegarde récente de \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers $userName, Aucune sauvegarde de votre ordinateur n'a été effectuée depuis $days jours. $numBackups sauvegardes ont étés effectuées du $firstTime jusqu'à il y a $days jours. Les sauvegardes devraient normalement survenir lorsque votre ordinateur est connecté au réseau. Si votre ordinateur a effectivement été connecté au réseau plus de quelques heures durant les derniers $days jours, vous devriez contacter votre responsable informatique pour savoir pourquoi les sauvegardes ne s'effectuent pas correctement. Autrement, si vous êtes en dehors du bureau, il n'y a pas d'autre chose que vous pouvez faire, à part faire des copies de vos fichiers importants sur d'autres medias. Vous devez réaliser que tout fichier crée ou modifié durant les $days derniers jours (incluant les courriels et les fichiers attachés) ne pourra pas être restauré si un problème survient avec votre ordinateur. Merci de votre attention, BackupPC Génie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Les fichiers de Outlook sur \$host doivent être sauvegardés"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers $userName, Les fichiers Outlook sur votre ordinateur n'ont $howLong. Ces fichiers contiennent tous vos courriels, fichiers attachés, carnets d'adresses et calendriers. $numBackups sauvegardes ont étés effectuées du $firstTime au $lastTime. Par contre, Outlook bloque ses fichiers lorsqu'il est ouvert, ce qui empêche de les sauvegarder. Il est recommandé d'effectuer une sauvegarde de vos fichiers Outlook quand vous serez connecté au réseau en quittant Outlook et toute autre application, et en visitant ce lien avec votre navigateur web: $CgiURL?host=$host Choisissez "Démarrer la sauvegarde incrémentielle" deux fois afin d'effectuer une nouvelle sauvegarde. Vous pouvez ensuite choisir "Retourner à la page de $host" et appuyer sur "Recharger" dans votre navigateur avec de vérifier le bon fonctionnement de la sauvegarde. La sauvegarde devrait prendre quelques minutes à s'effectuer. Merci de votre attention, BackupPC Génie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "jamais été sauvegardés"; $Lang{howLong_not_been_backed_up_for_days_days} = "pas été sauvegardés depuis \$days jours"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < Note: Cochez Écraser pour modifier une valeur spécifique à cette machine.

    EOF $Lang{CfgEdit_Button_Save} = "Sauvegarder"; $Lang{CfgEdit_Button_Insert} = "Insérer"; $Lang{CfgEdit_Button_Delete} = "Détruire"; $Lang{CfgEdit_Button_Add} = "Ajouter"; $Lang{CfgEdit_Button_Override} = "Écraser"; $Lang{CfgEdit_Button_New_Key} = "Nouvelle clé"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Erreur: Pas de sauvegarde à cause d'erreurs."; $Lang{CfgEdit_Error__must_be_an_integer} = "Erreur: \$var doit être un nombre entier"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Erreur: \$var doit être un nombre réel"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Erreur: l'entrée \$k de \$var doit être un nombre entier"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Erreur: l'entrée \$k de \$var doit être un nombre réel"; $Lang{CfgEdit_Error__must_be_executable_program} = "Erreur: \$var doit être un chemin exécutable"; $Lang{CfgEdit_Error__must_be_valid_option} = "Erreur: \$var doit être une option valide"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "La machine \$copyHost ne peut être copiée, car elle n'existe pas ; création d'une machine nommée \$fullHost. Détruisez cette machine si ce n'est pas ce que vous vouliez."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User a copié la config de \$fromHost à \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User a détruit \$p de \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User a ajouté \$p à \$conf en fixant sa valeur à \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User a changé \$p dans \$conf de \$valueOld à \$valueNew\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User a détruit la machine \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User a changé \$key de \$valueOld à \$valueNew sur \$host\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User a jouté la machine \$host: \$value\n"; #end of lang_fr.pm BackupPC-4.4.0/lib/BackupPC/Lang/en.pm0000444000047500004750000015762113673511776016162 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Start Archive"; $Lang{Stop_Dequeue_Archive} = "Stop/Dequeue Archive"; $Lang{Start_Full_Backup} = "Start Full Backup"; $Lang{Start_Incr_Backup} = "Start Incr Backup"; $Lang{Stop_Dequeue_Backup} = "Stop/Dequeue Backup"; $Lang{Restore} = "Restore"; $Lang{Type_full} = "full"; $Lang{Type_incr} = "incremental"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Only privileged users can view admin options."; $Lang{H_Admin_Options} = "BackupPC Server: Admin Options"; $Lang{Admin_Options} = "Admin Options"; $Lang{Admin_Options_Page} = < \${h2("Server Control")}

    Reload the server configuration:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Unable to connect to BackupPC server"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < The error was: \$err.
    Perhaps the BackupPC server is not running or there is a configuration error. Please report this to your Sys Admin. EOF $Lang{Admin_Start_Server} = < The BackupPC server at \$Conf{ServerHost} port \$Conf{ServerPort} is not currently running (maybe you just stopped it, or haven't yet started it).
    Do you want to start it? EOF # ----- $Lang{H_BackupPC_Server_Status} = "BackupPC Server Status"; $Lang{BackupPC_Server_Status_General_Info} = <
  • The servers PID is \$Info{pid}, on host \$Conf{ServerHost}, version \$Info{Version}, started at \$serverStartTime.
  • This status was generated at \$now.
  • The configuration was last loaded at \$configLoadTime.
  • PCs will be next queued at \$nextWakeupTime.
  • Other info:
    • \$numBgQueue pending backup requests from last scheduled wakeup,
    • \$numUserQueue pending user backup requests,
    • \$numCmdQueue pending command requests, \$poolInfo
    • Pool file system was recently at \$Info{DUlastValue}% (\$DUlastTime), today\'s max is \$Info{DUDailyMax}% (\$DUmaxTime) and yesterday\'s max was \$Info{DUDailyMaxPrev}%.
    • Pool file system inode usage was recently at \$Info{DUInodelastValue}% (\$DUlastTime), today\'s max is \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) and yesterday\'s max was \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Currently Running Jobs")}

    \$jobStr
    Host Type User Start Time Command PID Xfer PID Status Count

    \$generalInfo \${h2("Failures that need attention")}

    \$statusStr
    Host Type User Last Try Details Error Time Last error (other than no ping)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Host Summary"; $Lang{BackupPC__Archive} = "BackupPC: Archive"; $Lang{BackupPC_Summary} = <

    • This status was generated at \$now.
    • Pool file system was recently at \$Info{DUlastValue}% (\$DUlastTime), today\'s max is \$Info{DUDailyMax}% (\$DUmaxTime) and yesterday\'s max was \$Info{DUDailyMaxPrev}%.
    • Pool file system inode usage was recently at \$Info{DUInodelastValue}% (\$DUlastTime), today\'s max is \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) and yesterday\'s max was \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hosts with good Backups")}

    There are \$hostCntGood hosts that have been backed up, for a total of:

    • \$fullTot full backups of total size \${fullSizeTot}GiB (prior to pooling and compression),
    • \$incrTot incr backups of total size \${incrSizeTot}GiB (prior to pooling and compression).

    \$strGood
    Host User Comment #Full Full Age (days) Full Size (GiB) Speed (MiB/s) #Incr Incr Age (days) Last Backup (days) State #Xfer errs Last attempt
    \${h2("Hosts with no Backups")}

    There are \$hostCntNone hosts with no backups.

    \$strNone
    Host User Comment #Full Full Age (days) Full Size (GiB) Speed (MiB/s) #Incr Incr Age/days Last Backup (days) State #Xfer errs Last attempt
    EOF $Lang{BackupPC_Archive} = < There are \$hostCntGood hosts that have been backed up for a total size of \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host User Backup Size

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Archive Location/Device EOF $Lang{BackupPC_Archive2_compression} = < Compression None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Percentage of Parity Data (0 = disable, 5 = typical) EOF $Lang{BackupPC_Archive2_split} = < Split output into Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <Pool is \${poolSize}GiB comprising \$info->{"\${name}FileCnt"} files and \$info->{"\${name}DirCnt"} directories (as of \$poolTime),
  • Pool hashing gives \$info->{"\${name}FileCntRep"} repeated files with longest chain \$info->{"\${name}FileRepMax"},
  • Nightly cleanup removed \$info->{"\${name}FileCntRm"} files of size \${poolRmSize}GiB (around \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Backup Requested on \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Reply from server was: \$reply

    Go back to \$host home page. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Start Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < You are about to start a \$type backup on \$host.

    Do you really want to do this?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Stop Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < You are about to stop/dequeue backups on \$host;
    Also, please don\'t start another backup for hours.

    Do you really want to do this?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Only privileged users can view queues."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Only privileged users can Archive."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Queue Summary"; # -------------------------------- $Lang{Backup_Queue_Summary} = < The following user requests are currently queued:

    \$strUser
    Host Action Req Time User
    \${h2("Background Queue Summary")}

    The following background requests are currently queued:

    \$strBg
    Host Action Req Time User
    \${h2("Command Queue Summary")}

    The following command requests are currently queued:

    \$strCmd
    Host Action Req Time User Command
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: File \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, modified \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ skipped \$skipped lines ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nCan\'t open log file \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Log File History";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    File Size Modification time
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Recipient Host Time Subject
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Browse backup \$num for \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Restore Options for \$host"; $Lang{Restore_Options_for__host2} = < You have selected the following files/directories from share \$share, backup number #\$num:
      \$fileListStr

    You have three choices for restoring these files/directories. Please select one of the following options.

    \${h2("Option 1: Direct Restore")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Warning: any existing files that match the ones you have selected will be overwritten!

    \$hiddenStr
    Restore the files to host
    Restore the files to share
    Restore the files below dir
    (relative to share)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Option 2: Download Zip archive")}

    You can download a Zip archive containing all the files/directories you have selected. You can then use a local application, such as WinZip, to view or extract any of the files.

    Warning: depending upon which files/directories you have selected, this archive might be very very large. It might take many minutes to create and transfer the archive, and you will need enough local disk space to store it.

    \$hiddenStr Make archive relative to \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (otherwise archive will contain full paths).
    Compression (0=off, 1=fast,...,9=best)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Option 2: Download Zip archive")}

    Archive::Zip is not installed so you will not be able to download a zip archive. Please ask your system adminstrator to install Archive::Zip from www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < You can download a Tar archive containing all the files/directories you have selected. You can then use a local application, such as tar or WinZip to view or extract any of the files.

    Warning: depending upon which files/directories you have selected, this archive might be very very large. It might take many minutes to create and transfer the archive, and you will need enough local disk space to store it.

    \$hiddenStr Make archive relative to \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (otherwise archive will contain full paths).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Restore Confirm on \$host"; $Lang{Are_you_sure} = < You are about to start a restore directly to the machine \$In{hostDest}. The following files will be restored to share \$In{shareDest}, from backup number \$num:

    \$fileListStr
    Original file/dirWill be restored to

    \$hiddenStr Do you really want to do this?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Restore Requested on \$hostDest"; $Lang{Reply_from_server_was___reply} = < Reply from server was: \$reply

    Go back to \$hostDest home page. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Reply from server was: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Host \$host Backup Summary"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("User Actions")}

    \$startIncrStr

    \${h2("Backup Summary")}

    Click on the backup number to browse and restore backup files.

    \$deleteHdrStr \$str
    Backup# Type Filled Level Start Date Duration/mins Age/days Keep Comment

    \$restoreStr

    \${h2("Xfer Error Summary")} \$errStr
    Backup# Type View #Xfer errs #bad files #bad share #tar errs
    \${h2("File Size/Count Reuse Summary")}

    Existing files are those already in the pool; new files are those added to the pool. Empty files and SMB errors aren\'t counted in the reuse and new counts.

    \$sizeStr
    Totals Existing Files New Files
    Backup# Type #Files Size/MiB MiB/sec #Files Size/MiB #Files Size/MiB
    \${h2("Compression Summary")}

    Compression performance for files already in the pool and newly compressed files.

    \$compStr
    Existing Files New Files
    Backup# Type Comp Level Size/MiB Comp/MiB Comp Size/MiB Comp/MiB Comp
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archive Summary"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("User Actions")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Error"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Server"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • You are browsing backup #\$num, which started around \$backupTime (\$backupAge days ago), \$filledBackup
    • Enter directory:
    • Comment:
    • Click on a directory below to navigate into that directory,
    • Click on a file below to restore that file,
    • You can view the backup history of the current directory. \$share2pathStr
    \${h2("Contents of \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mapping of share name to real client path (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Directory backup history for \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < This display shows each unique version of files across all the backups:
    • Click on a backup number to return to the backup browser,
    • Click on a directory link (\$Lang->{DirHistory_dirLink}) to navigate into that directory,
    • Click on a file version link (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) to download that file,
    • Files with the same contents between different backups have the same version number (except between v3 and v4 backups),
    • Files or directories not present in a particular backup have an empty box.
    • Files shown with the same version might have different attributes. Select the backup number to see the file attributes.
    \${h2("History of \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Backup number
    Backup time
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Restore #\$num details for \$host"; $Lang{Restore___num_details_for__host2} = <
    Number \$Restores[\$i]{num}
    Requested by \$RestoreReq{user}
    Request time \$reqTime
    Result \$Restores[\$i]{result}
    Error Message \$Restores[\$i]{errorMsg}
    Source host \$RestoreReq{hostSrc}
    Source backup num \$RestoreReq{num}
    Source share \$RestoreReq{shareSrc}
    Destination host \$RestoreReq{hostDest}
    Destination share \$RestoreReq{shareDest}
    Start time \$startTime
    Duration \$duration min
    Number of files \$Restores[\$i]{nFiles}
    Total size \${MB} MiB
    Transfer rate \$MBperSec MiB/sec
    TarCreate errors \$Restores[\$i]{tarCreateErrs}
    Xfer errors \$Restores[\$i]{xferErrs}
    Xfer log file View, Errors

    \${h1("File/Directory list")}

    \$fileListStr
    Original file/dirRestored to
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Archive #\$num details for \$host"; $Lang{Archive___num_details_for__host2} = <
    Number \$Archives[\$i]{num}
    Requested by \$ArchiveReq{user}
    Request time \$reqTime
    Result \$Archives[\$i]{result}
    Error Message \$Archives[\$i]{errorMsg}
    Start time \$startTime
    Duration \$duration min
    Xfer log file View, Errors

    \${h1("Host list")}

    \$HostListStr
    HostBackup Number
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Email Summary"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: check apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Wrong user: my userid is \$>, instead of \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Only privileged users can view PC summaries."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Only privileged users can stop or start backups on \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Invalid number \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Unable to open \$file: configuration problem?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Only privileged users can view log or config files."; $Lang{Only_privileged_users_can_view_log_files} = "Only privileged users can view log files."; $Lang{Only_privileged_users_can_view_email_summaries} = "Only privileged users can view email summaries."; $Lang{Only_privileged_users_can_browse_backup_files} = "Only privileged users can browse backup files for host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Empty host name."; $Lang{Directory___EscHTML} = "Directory \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} is empty"; $Lang{Can_t_browse_bad_directory_name2} = "Can\'t browse bad directory name \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Only privileged users can restore backup files for host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Bad host name \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "You haven\'t selected any files; please go Back to select some files."; $Lang{You_haven_t_selected_any_hosts} = "You haven\'t selected any hosts; please go Back to select some hosts."; $Lang{Nice_try__but_you_can_t_put} = "Nice try, but you can\'t put \'..\' in any of the file names"; $Lang{Host__doesn_t_exist} = "Host \${EscHTML(\$In{hostDest})} doesn\'t exist"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "You don\'t have permission to restore onto host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Can\'t open/create \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Only privileged users can restore backup files for host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Empty host name"; $Lang{Unknown_host_or_user} = "Unknown host or user \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Only privileged users can view information about host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Only privileged users can view archive information."; $Lang{Only_privileged_users_can_view_restore_information} = "Only privileged users can view restore information."; $Lang{Restore_number__num_for_host__does_not_exist} = "Restore number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archive number \$num for host \${EscHTML(\$host)} does not exist."; $Lang{Can_t_find_IP_address_for} = "Can\'t find IP address for \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Until I see \$host at a particular DHCP address, you can only start this request from the client machine itself. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Backup requested on DHCP \$host (\$In{hostIP}) by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Backup requested on \$host by \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Backup stopped/dequeued on \$host by \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Restore requested to host \$hostDest, backup #\$num, by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archive requested by \$User from \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Status"; $Lang{PC_Summary} = "Host Summary"; $Lang{LOG_file} = "LOG file"; $Lang{LOG_files} = "LOG files"; $Lang{Old_LOGs} = "Old LOGs"; $Lang{Email_summary} = "Email summary"; $Lang{Config_file} = "Config file"; # $Lang{Hosts_file} = "Hosts file"; $Lang{Current_queues} = "Current queues"; $Lang{Documentation} = "Documentation"; #$Lang{Host_or_User_name} = "Host or User name:"; $Lang{Go} = "Go"; $Lang{Hosts} = "Hosts"; $Lang{Select_a_host} = "Select a host..."; $Lang{There_have_been_no_archives} = "

    There have been no archives

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    This PC has never been backed up!!

    \n"; $Lang{This_PC_is_used_by} = "
  • This PC is used by \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Extracting only Errors)"; $Lang{XferLOG} = "XferLOG"; $Lang{Errors} = "Errors"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Last email sent to \${UserLink(\$user)} was at \$mailTime, subject "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <The command \$cmd is currently running for \$host, started \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Host \$host is queued on the background queue (will be backed up soon). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Host \$host is queued on the user queue (will be backed up soon). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <A command for \$host is on the command queue (will run soon). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Last status is state \"\$Lang->{\$StatusHost{state}}\"\$reason as of \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <Last error is \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Pings to \$host have failed \$StatusHost{deadCnt} consecutive times. EOF # ----- $Lang{Prior_to_that__pings} = "Prior to that, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr to \$host have succeeded \$StatusHost{aliveCnt} consecutive times. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Because \$host has been on the network at least \$Conf{BlackoutGoodCnt} consecutive times, it will not be backed up from \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 on \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Backups are deferred for \$hours hours (change this number). EOF $Lang{tryIP} = " and \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Select all EOF $Lang{checkAllHosts} = <  Select all EOF $Lang{fileHeader} = < Name Type Mode # Size Date modified EOF $Lang{Home} = "Home"; $Lang{Browse} = "Browse backups"; $Lang{Last_bad_XferLOG} = "Last bad XferLOG"; $Lang{Last_bad_XferLOG_errors_only} = "Last bad XferLOG (errors only)"; $Lang{This_display_is_merged_with_backup} = < This display is merged with backup #\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Select the backup you wish to view: EOF $Lang{Restore_Summary} = < Click on the restore number for more details. \$restoreStr
    Restore# Result Start Date Dur/mins #files MiB #tar errs #xferErrs

    EOF $Lang{Archive_Summary} = < Click on the archive number for more details. \$ArchiveStr
    Archive# Result Start Date Dur/mins

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentation"; $Lang{No} = "no"; $Lang{Yes} = "yes"; $Lang{The_directory_is_empty} = <The directory \$dirDisplay is empty EOF #$Lang{on} = "on"; $Lang{off} = "off"; $Lang{backupType_full} = "full"; $Lang{backupType_incr} = "incr"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "partial"; $Lang{failed} = "failed"; $Lang{success} = "success"; $Lang{and} = "and"; # ------ # Hosts states and reasons $Lang{Status_idle} = "idle"; $Lang{Status_backup_starting} = "backup starting"; $Lang{Status_backup_in_progress} = "backup in progress"; $Lang{Status_restore_starting} = "restore starting"; $Lang{Status_restore_in_progress} = "restore in progress"; $Lang{Status_admin_pending} = "link pending"; $Lang{Status_admin_running} = "link running"; $Lang{Reason_backup_done} = "done"; $Lang{Reason_restore_done} = "restore done"; $Lang{Reason_archive_done} = "archive done"; $Lang{Reason_nothing_to_do} = "idle"; $Lang{Reason_backup_failed} = "backup failed"; $Lang{Reason_restore_failed} = "restore failed"; $Lang{Reason_archive_failed} = "archive failed"; $Lang{Reason_no_ping} = "no ping"; $Lang{Reason_backup_canceled_by_user} = "backup canceled by user"; $Lang{Reason_restore_canceled_by_user} = "restore canceled by user"; $Lang{Reason_archive_canceled_by_user} = "archive canceled by user"; $Lang{Disabled_OnlyManualBackups} = "auto disabled"; $Lang{Disabled_AllBackupsDisabled} = "disabled"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: no backups of \$host have succeeded"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has never been successfully backed up by our PC backup software. PC backups should occur automatically when your PC is connected to the network. You should contact computer support if: - Your PC has been regularly connected to the network, meaning there is some configuration or setup problem preventing backups from occurring. - You don't want your PC backed up and you want these email messages to stop. Otherwise, please make sure your PC is connected to the network next time you are in the office. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: no recent backups on \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has not been successfully backed up for $days days. Your PC has been correctly backed up $numBackups times from $firstTime to $days days ago. PC backups should occur automatically when your PC is connected to the network. If your PC has been connected for more than a few hours to the network during the last $days days you should contact IS to find out why backups are not working. Otherwise, if you are out of the office, there's not much you can do, other than manually copying especially critical files to other media. You should be aware that any files you have created or changed in the last $days days (including all new email and attachments) cannot be restored if your PC disk crashes. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlook files on \$host need to be backed up"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "not been backed up successfully"; $Lang{howLong_not_been_backed_up_for_days_days} = "not been backed up for \$days days"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < Note: Check Override if you want to modify a value specific to this host.

    EOF $Lang{CfgEdit_Button_Save} = "Save"; $Lang{CfgEdit_Button_Insert} = "Insert"; $Lang{CfgEdit_Button_Delete} = "Delete"; $Lang{CfgEdit_Button_Add} = "Add"; $Lang{CfgEdit_Button_Override} = "Override"; $Lang{CfgEdit_Button_New_Key} = "New Key"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Error: No save due to errors"; $Lang{CfgEdit_Error__must_be_an_integer} = "Error: \$var must be an integer"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Error: \$var must be a real-valued number"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Error: \$var entry \$k must be an integer"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Error: \$var entry \$k must be a real-valued number"; $Lang{CfgEdit_Error__must_be_executable_program} = "Error: \$var must be a valid executable path"; $Lang{CfgEdit_Error__must_be_valid_option} = "Error: \$var must be a valid option"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Copy host \$copyHost doesn't exist; creating full host name \$fullHost. Delete this host if that is not what you wanted."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User copied config from host \$fromHost to \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User deleted \$p from \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User added \$p to \$conf, set to \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User changed \$p in \$conf to \$valueNew from \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User deleted host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host changed \$key from \$valueOld to \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User added host \$host: \$value\n"; #end of lang_en.pm BackupPC-4.4.0/lib/BackupPC/Lang/de.pm0000444000047500004750000017155013673511776016145 0ustar craigcraig#!/usr/bin/perl # # by Ralph Passgang (13.11.2006 for V3.0.0) # by Ralph Passgang (30.06.2006 for V3.0.0) # by Ralph Passgang (07.06.2004 for V2.1.0beta3) # by Ralph Passgang (06.05.2004 for V2.1.0beta2) # by Manfred Herrmann (11.03.2004 for V2.1.0beta0) # by Manfred Herrmann (V1.1) (some typo errors + 3 new strings) # CVS-> Revision ??? # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Archivierung starten"; $Lang{Stop_Dequeue_Archive} = "Archivierung stoppen"; $Lang{Start_Full_Backup} = "Starte vollständiges Backup"; $Lang{Start_Incr_Backup} = "Starte inkrementelles Backup"; $Lang{Stop_Dequeue_Backup} = "Backup stoppen/aussetzen"; $Lang{Restore} = "Wiederherstellen"; $Lang{Type_full} = "voll"; $Lang{Type_incr} = "inkrementell"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Nur privilegierte Nutzer können die Administrationsoptionen einsehen."; $Lang{H_Admin_Options} = "BackupPC: Server Administrationsoptionen"; $Lang{Admin_Options} = "Admin Optionen"; $Lang{Admin_Options_Page} = < \${h2("Server Steuerung")}

    Server Konfiguration neu laden:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Kann keine Verbindung zu dem BackupPC Server herstellen!"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < Der Fehler war: \$err.
    Möglicherweise ist der BackupPC Server Prozess nicht gestartet oder es besteht ein Konfigurationsfehler. Bitte teilen Sie diese Fehlermeldung dem Systemadministrator mit. EOF $Lang{Admin_Start_Server} = < Der BackupPC Server auf \$Conf{ServerHost} Port \$Conf{ServerPort} ist momentan nicht aktiv (möglicherweise wurde er gestoppt, oder noch nicht gestartet).
    Möchten Sie den Server starten? EOF # ----- $Lang{H_BackupPC_Server_Status} = "BackupPC Serverstatus"; $Lang{BackupPC_Server_Status_General_Info} = <
  • Die Server Prozess ID (PID) ist \$Info{pid}, auf Computer \$Conf{ServerHost}, Version \$Info{Version}, gestartet am \$serverStartTime.
  • Dieser Status wurde am \$now generiert.
  • Die Konfiguration wurde am \$configLoadTime neu geladen.
  • Computer werden am \$nextWakeupTime auf neue Aufträge geprüft.
  • Weitere Informationen:
    • \$numBgQueue wartende Backup Aufträge der letzten Prüfung,
    • \$numUserQueue wartende Aufträge von Benutzern,
    • \$numCmdQueue wartende Kommando Aufträge. \$poolInfo
    • Das Pool Filesystem (Backup-Speicherplatz) ist zu \$Info{DUlastValue}% (\$DUlastTime) voll, das Maximum heute ist \$Info{DUDailyMax}% (\$DUmaxTime) und das Maximum gestern war \$Info{DUDailyMaxPrev}%. (Hinweis: Sollten ca. 70% überschritten werden, so ist evtl. bald eine Erweiterung des Backupspeichers erforderlich. Ist weitere Planung nötig?)
    • Das Pool Filesystem Inode (Backup-Speicherplatz) ist zu \$Info{DUInodelastValue}% (\$DUlastTime) voll, das Maximum heute ist \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) und das Maximum gestern war \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Zur Zeit aktive Aufträge")}

    \$jobStr
    Computer Typ Benutzer Startzeit Kommando PID Transport PID Status Count

    \$generalInfo \${h2("Fehler, die näher analysiert werden müssen!")}

    \$statusStr
    Computer Typ Benutzer letzter Versuch Details Fehlerzeit Letzter Fehler (ausser "kein ping")
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Computerübersicht"; $Lang{BackupPC__Archive} = "BackupPC: Archivierung"; $Lang{BackupPC_Summary} = <

    • Dieser Status wurde am \$now generiert.
    • Das Pool Filesystem (Backup-Speicherplatz) ist zu \$Info{DUlastValue}% (\$DUlastTime) voll, das Maximum heute ist \$Info{DUDailyMax}% (\$DUmaxTime) und das Maximum gestern war \$Info{DUDailyMaxPrev}%. (Hinweis: Sollten ca. 70% überschritten werden, so ist evtl. bald eine Erweiterung des Backupspeichers erforderlich. Ist weitere Planung nötig?)
    • Das Pool Filesystem Inode (Backup-Speicherplatz) ist zu \$Info{DUInodelastValue}% (\$DUlastTime) voll, das Maximum heute ist \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) und das Maximum gestern war \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Computer mit erfolgreichen Backups")}

    Es gibt \$hostCntGood Computer die erfolgreich gesichert wurden, mit insgesamt:

    • \$fullTot Volle Backups, Gesamtgröße \${fullSizeTot}GiB (vor Pooling und Komprimierung),
    • \$incrTot Inkrementelle Backups, Gesamtgröße \${incrSizeTot}GiB (vor Pooling und Komprimierung).

    \$strGood
    Computer Benutzer Kommentar #Voll Alter (Tage) Größe (GiB) MB/sek #Inkr Alter (Tage) Letzes Backup (Tage) Status #Xfer Fehler Letzte Aktion
    \${h2("Computer ohne Backups")}

    Es gibt \$hostCntNone Computer ohne Backups!

    \$strNone
    Computer Benutzer Kommentar #Voll Alter (Tage) Größe (GiB) MB/sek #Inkr Alter (Tage) Letztes Backup (Tage) Status #Xfer Fehler Letzter Versuch
    EOF $Lang{BackupPC_Archive} = < Es gibt \$hostCntGood Computer die gesichert wurden, mit insgesamt \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Computer Benutzer Backup Größe

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Archivierungsort/Gerät EOF $Lang{BackupPC_Archive2_compression} = < Kompression None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Prozentsatz Paritätsdaten (0 = keine, 5 = Standard) EOF $Lang{BackupPC_Archive2_split} = < Aufteilen in Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <Der Pool hat eine Größe von \${poolSize}GiB und enthält \$info->{"\${name}FileCnt"} Dateien und \$info->{"\${name}DirCnt"} Verzeichnisse (Stand \$poolTime).
  • Das "Pool hashing" ergibt \$info->{"\${name}FileCntRep"} wiederholte Dateien mit der längsten Verkettung von \$info->{"\${name}FileRepMax"}.
  • Die nächtliche Bereinigung entfernte \$info->{"\${name}FileCntRm"} Dateien mit einer Größe von \${poolRmSize}GiB (um ca. \$poolTime). EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Backupauftrag für \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Die Antwort des Servers war: \$reply

    Gehe zurück zur \$host Hauptseite. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Starte Backup von \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Sie starten ein \$type Backup für \$host.

    Möchten Sie das wirklich tun?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Beende Backup von \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Sie werden Backups abbrechen bzw. Aufträge löschen für Computer \$host;
    Zusätzlich bitte keine Backups starten für die Dauer von Stunden.

    Möchten Sie das wirklich tun?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Nur berechtigte Benutzer können die Warteschlangen einsehen."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Nur berechtigte Benutzer könnnen archivieren."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Warteschlange Übersicht"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Die folgenden Benutzeraufträge sind eingereiht:

    \$strUser
    Computer Action Uhrzeit Benutzer
    \${h2("Übersicht Hintergrundaufträge in der Warteschlange")}

    Die folgenden Hintergrundaufträge sind eingereiht:

    \$strBg
    Computer Action Uhrzeit Benutzer
    \${h2("Übersicht Kommandoaufträge in der Warteschlange")}

    Die folgenden Kommandoaufträge sind eingereiht:

    \$strCmd
    Computer Action Uhrzeit Benutzer Kommando
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Datei \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, verändert am \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ überspringe \$skipped Zeilen ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nKann LOG Datei nicht öffnen \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: LOG Datei Historie";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Datei Größe letzte Änderung
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Empfänger Computer Zeitpunkt Betreff
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Durchsuchen des Backups \$num für Computer \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Wiederherstellungsoptionen für \$host"; $Lang{Restore_Options_for__host2} = < Sie haben die folgenden Dateien/Verzeichnisse aus der Freigabe \$share des Backups mit der Nummer #\$num selektiert:
      \$fileListStr

    Sie haben drei verschiedene Möglichkeiten zur Wiederherstellung (Restore) der Dateien/Verzeichnisse. Bitte wählen Sie eine der folgenden Möglichkeiten:.

    \${h2("Möglichkeit 1: Direkte Wiederherstellung")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost wiederherzustellen. Alternativ können Sie einen anderen Computer und/oder Freigabe als Ziel angeben.

    Warnung: alle aktuell existierenden Dateien/Verzeichnisse, die bereits vorhanden sind, werden überschrieben! (Tip: Alternativ eine spezielle Freigabe erstellen mit Schreibrecht für den Backup-Benutzer und die wiederhergestellten Dateien/Verzeichnisse durch Stichproben prüfen, ob die beabsichtigte Wiederherstellung korrekt ist.)

    \$hiddenStr
    Restore auf Computer
    Restore auf Freigabe
    Restore in Unterverzeichnis
    (relativ zur Freigabe)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Möglichkeit 2: Download als Zip Archiv")}

    Sie können eine ZIP Archivdatei downloaden, die alle selektierten Dateien/Verzeichnisse enthält. Mit einer lokalen Anwendung (z.B. WinZIP, WinXP-ZIP-Ordner...) können Sie dann beliebige Dateien entpacken.

    Warnung: Abhängig von der Anzahl und Größe der selektierten Dateien/Verzeichnisse kann die ZIP Archiv Datei extrem groß bzw. zu groß werden. Der Download kann sehr lange dauern und der Speicherplatz auf Ihrem PC muß ausreichen. Selektieren Sie evtl. die Dateien/Verzeichnisse erneut und lassen sehr große und unnötige Dateien weg.

    \$hiddenStr Archiv relativ zu Pfad \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (andernfalls enthält die Archiv Datei vollständige Pfade).
    Kompression (0=aus, 1=schnelle,...,9=höchste)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Möglichkeit 2: Download als Zip Archiv")}

    Archive::Zip ist nicht installiert. Der Download als Zip Archiv Datei ist daher nicht möglich. Bitte lassen Sie bei Bedarf von Ihrem Administrator die Perl-Erweiterung Archive::Zip von www.cpan.org installieren. Vielen Dank!

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Sie können eine Tar Archivdatei downloaden, die alle selektierten Dateien/Verzeichnisse enthält. Mit einer lokalen Anwendung (z.B. tar, WinZIP...) können Sie dann beliebige Dateien entpacken.

    Warnung: Abhängig von der Anzahl und Größe der selektierten Dateien/Verzeichnisse kann die Tar-Archiv Datei extrem groß bzw. zu groß werden. Der Download kann sehr lange dauern und der Speicherplatz auf Ihrem PC muß ausreichen. Selektieren Sie evtl. die Dateien/Verzeichnisse erneut und lassen sehr große und unnötige Dateien weg.

    \$hiddenStr Archiv relativ zu Pfad \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (andernfalls enthält die Archiv Datei vollständige Pfade).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Bestätigung für die Wiederherstellung auf \$host"; $Lang{Are_you_sure} = < Sie starten eine direkte Wiederherstellung auf den Computer \$In{hostDest}. Die folgenden Dateien werden auf die Freigabe \$In{shareDest} wiederhergestellt, von dem Backup mit der Nummer \$num:

    \$fileListStr
    Original Datei/Verzeichnis:Wird wiederhergestellt nach:

    \$hiddenStr Wollen Sie das wirklich tun?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Wiederherstellung beauftragt auf Computer \$hostDest"; $Lang{Reply_from_server_was___reply} = < Die Antwort des Servers war: \$reply

    Zurück zur \$hostDest Hauptseite. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Die Antwort des Server war: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupServer: Computer \$host Backupübersicht"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Benutzeraktionen")}

    \$startIncrStr

    \${h2("Backupübersicht")}

    Klicken Sie auf die Backupnummer um die Dateien zu durchsuchen und bei Bedarf wiederherzustellen.

    \$deleteHdrStr \$str
    Backup# Typ gefüllt Level Start Zeitpunkt Dauer/min Alter/Tage Behalten Kommentar

    \$restoreStr

    \${h2("Xfer Fehler Übersicht - bitte kontrollieren")} \$errStr
    Backup# Typ Anzeigen #Xfer Fehler #Dateifehler #Freigabefehler #tar Fehler
    \${h2("Datei Größe/Anzahl Wiederverwendungsübersicht")}

    "Bestehende Dateien" bedeutet bereits im Pool vorhanden. "Neue Dateien" bedeutet neu zum Pool hinzugefügt. Leere Dateien und eventuelle Dateifehler sind nicht in den Summen enthalten.

    \$sizeStr
    Gesamt bestehende Dateien neue Dateien
    Backup# Typ #Dateien Größe/MB MB/sec #Dateien Größe/MB #Dateien Größe/MB
    \${h2("Kompressions Übersicht")}

    Kompressionsergebnisse für bereits im Backup-Pool vorhandene und für neu komprimierte Dateien.

    \$compStr
    vorhandene Dateien neue Dateien
    Backup# Typ Komp Level Größe/MB Komp/MB Komp Größe/MB Komp/MB Komp
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archivübersicht"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Benutzeraktionen")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupServer: Fehler"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Server"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Sie browsen das Backup #\$num, erstellt am \$backupTime (vor \$backupAge Tagen), \$filledBackup
    • Verzeichnis eingeben:
    • Kommentar:
    • Klicken Sie auf ein Verzeichnis um dieses zu durchsuchen.
    • Klicken Sie auf eine Datei um diese per Download wiederherzustellen.
    • Einsehen der Backup Historie des aktuellen Verzeichnisses. \$share2pathStr
    \${h2("Inhalt von \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Zuordnung des Freigabenamens zum realen Clientpfad (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Verzeichnishistorie für \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "Verzeichnis"; $Lang{DirHistory_fileLink} = "V"; $Lang{DirHistory_for__host} = < Diese Ansicht zeigt alle unterschiedlichen Versionen der Dateien in den Datensicherungen:
    • Klicken Sie auf eine Datensicherungsnummer für die Datensicherungsübersicht.
    • Wählen Sie hier auf einen Verzeichnis Namen: (\$Lang->{DirHistory_dirLink}) um Verzeichnisse anzuzeigen.
    • Klicken Sie auf eine Dateiversion (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) für einen Download der Datei.
    • Dateien mit dem gleichen Inhalt in verschiedenen Datensicherungen haben die gleiche Versionsnummer (PleaseTranslateThis: except between v3 and v4 backups).
    • Dateien oder Verzeichnisse, die in einer Datensicherung nicht vorhanden sind, haben dort keinen Eintrag.
    • Dateien mit der gleichen Version können unterschiedliche Attribute haben. Wählen Sie die Datensicherungsnummer um die Attribute anzuzeigen.
    \${h2("Historie von \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Datensicherungnummer
    Sicherungszeitpunkt
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Restore #\$num Details für Computer \$host"; $Lang{Restore___num_details_for__host2} = <
    Nummer \$Restores[\$i]{num}
    beauftragt von \$RestoreReq{user}
    Auftrag Zeitpunkt \$reqTime
    Ergebnis \$Restores[\$i]{result}
    Fehlermeldung \$Restores[\$i]{errorMsg}
    Quelle Computer \$RestoreReq{hostSrc}
    Quelle Backup Nr. \$RestoreReq{num}
    Quelle Freigabe \$RestoreReq{shareSrc}
    Ziel Computer \$RestoreReq{hostDest}
    Ziel Freigabe \$RestoreReq{shareDest}
    Start Zeitpunkt \$startTime
    Dauer \$duration min
    Anzahl Dateien \$Restores[\$i]{nFiles}
    Größe gesamt \${MB} MB
    Transferrate \$MBperSec MB/sec
    TarCreate Fehler \$Restores[\$i]{tarCreateErrs}
    Xfer Fehler \$Restores[\$i]{xferErrs}
    Xfer LOG Datei Anzeigen, Fehler

    \${h1("Datei/Verzeichnis Liste")}

    \$fileListStr
    Original Datei/Verzeichniswiederhergestellt nach
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Archiv #\$num Details für \$host"; $Lang{Archive___num_details_for__host2} = <
    Nummer \$Archives[\$i]{num}
    beauftragt von \$ArchiveReq{user}
    Auftrag Zeitpunkt \$reqTime
    Ergebnis \$Archives[\$i]{result}
    Fehlermeldung \$Archives[\$i]{errorMsg}
    Start Zeitpunkt \$startTime
    Dauer \$duration min
    Xfer LOG Datei Anzeigen, Fehler

    \${h1("Computerliste")}

    \$HostListStr
    ComputerDatensicherungsnummer
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: E-Mailübersicht"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: Überprüfen Sie das Apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Falscher Benutzer: Meine userid ist \$>, anstelle \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Nur berechtigte Benutzer können die Computer Übersicht einsehen."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Nur berechtigte Benutzer können Backups starten und stoppen für \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "ungültige Nummer \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "kann Datei nicht öffnen \$file: Konfigurationsproblem?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Nur berechtigte Benutzer können Log oder Config Dateien einsehen."; $Lang{Only_privileged_users_can_view_log_files} = "Nur berechtigte Benutzer können LOG Dateien einsehen."; $Lang{Only_privileged_users_can_view_email_summaries} = "Nur berechtigte Benutzer können die E-Mail Übersicht einsehen."; $Lang{Only_privileged_users_can_browse_backup_files} = "Nur berechtigte Benutzer können Backup Dateien durchsuchen für computer \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Kein Hostname."; $Lang{Directory___EscHTML} = "Verzeichnis \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} ist leer"; $Lang{Can_t_browse_bad_directory_name2} = "Kann fehlerhaften Verzeichnisnamen nicht durchsuchen \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Nur berechtigte Benutzer können Dateien wiederherstellen für Computer \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Falscher Computer Name \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Sie haben keine Dateien selektiert; bitte gehen Sie zurück um Dateien zu selektieren."; $Lang{You_haven_t_selected_any_hosts} = "Sie haben keinen Computer gewählt, bitte zurück gehen um einen auszuwählen."; $Lang{Nice_try__but_you_can_t_put} = "Sie dürfen \'..\' nicht in Dateinamen verwenden"; $Lang{Host__doesn_t_exist} = "Computer \${EscHTML(\$In{hostDest})} existiert nicht"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Sie haben keine Berechtigung zum Restore auf Computer \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Kann Datei nicht öffnen oder erstellen \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Nur berechtigte Benutzer dürfen Backup und Restore von Dateien für Computer \${EscHTML(\$host)} durchführen."; $Lang{Empty_host_name} = "leerer Computer Name"; $Lang{Unknown_host_or_user} = "Unbekannter Computer oder Benutzer \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Nur berechtigte Benutzer können Informationen sehen über Computer \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Nur berechtigte Benutzer können Archiv Informationen einsehen."; $Lang{Only_privileged_users_can_view_restore_information} = "Nur berechtigte Benutzer können Restore Informationen einsehen."; $Lang{Restore_number__num_for_host__does_not_exist} = "Restore Nummer \$num für Computer \${EscHTML(\$host)} existiert nicht."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archiv Nummer \$num für Computer \${EscHTML(\$host)} existiert nicht."; $Lang{Can_t_find_IP_address_for} = "Kann IP-Adresse für \${EscHTML(\$host)} nicht finden"; $Lang{host_is_a_DHCP_host} = < Solange bis ich \$host mit einer DHCP-Adresse sehe, können Sie diesen Auftrag nur vom diesem Client Computer aus starten. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Backup angefordert für DHCP Computer \$host (\$In{hostIP}) durch \$User von \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Backup angefordert für \$host durch \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Backup gestoppt/gelöscht für \$host durch \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Restore beauftragt nach Computer \$hostDest, von Backup #\$num," . " durch User \$User von Client \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivierung beauftragt durch \$User von \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Status"; $Lang{PC_Summary} = "Computerübersicht"; $Lang{LOG_file} = "LOG Datei"; $Lang{LOG_files} = "LOG Dateien"; $Lang{Old_LOGs} = "Alte LOG Dateien"; $Lang{Email_summary} = "E-Mailübersicht"; $Lang{Config_file} = "Konfigurationsdatei"; # $Lang{Hosts_file} = "Hosts Datei"; $Lang{Current_queues} = "Warteschlangen"; $Lang{Documentation} = "Dokumentation"; #$Lang{Host_or_User_name} = "Computer oder Benutzer Name:"; $Lang{Go} = "gehe zu"; $Lang{Hosts} = "Computer"; $Lang{Select_a_host} = "Computer auswählen..."; $Lang{There_have_been_no_archives} = "

    Es existieren keine Archive

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Dieser Computer wurde nie gesichert!

    \n"; $Lang{This_PC_is_used_by} = "
  • Dieser Computer wird betreut von \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(nur Fehler anzeigen)"; $Lang{XferLOG} = "XferLOG"; $Lang{Errors} = "Fehler"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Letzte E-Mail gesendet an \${UserLink(\$user)} am \$mailTime, Titel "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Das Kommando \$cmd wird gerade für Computer \$host ausgeführt, gestartet am \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Computer \$host ist in die Hintergrundwarteschlange eingereiht (Backup wird bald gestartet). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Computer \$host ist in die Benutzerwarteschlange eingereiht (Backup wird bald gestartet). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Ein Kommando für Computer \$host ist in der Kommandowarteschlange (wird bald ausgeführt). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Letzter Status ist \"\$Lang->{\$StatusHost{state}}\"\$reason vom \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <Letzter Fehler ist \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Pings zu Computer \$host sind \$StatusHost{deadCnt} mal fehlgeschlagen. EOF # ----- $Lang{Prior_to_that__pings} = "vorher, Pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr zu Computer \$host waren \$StatusHost{aliveCnt} mal fortlaufend erfolgreich. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Da Computer \$host mindestens \$Conf{BlackoutGoodCnt} mal fortlaufend erreichbar war, wird er in der Zeit von \$blackoutStr nicht gesichert. (Die Sicherung erfolgt automatisch außerhalb der konfigurierten Betriebszeit) EOF $Lang{__time0_to__time1_on__days} = "\$t0 bis \$t1 am \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Backups sind für die nächsten \$hours Stunden deaktiviert. (diese Zeit ändern). EOF $Lang{tryIP} = " und \$StatusHost{dhcpHostIP}"; #$Lang{Host_Inhost} = "Computer \$In{host}"; $Lang{checkAll} = <  alles auswählen EOF $Lang{checkAllHosts} = <  alle auswählen EOF $Lang{fileHeader} = < Name Typ Rechte Backup# Größe letzte Änderung EOF $Lang{Home} = "Hauptseite"; $Lang{Browse} = "Datensicherungen anzeigen"; $Lang{Last_bad_XferLOG} = "Letztes fehlerhafte XferLOG"; $Lang{Last_bad_XferLOG_errors_only} = "Letztes fehlerhafte XferLOG (nur Fehler)"; $Lang{This_display_is_merged_with_backup} = < Diese Liste ist mit Backup #\$numF verbunden. EOF $Lang{Visit_this_directory_in_backup} = < Wählen Sie die anzuzeigende Datensicherung: EOF $Lang{Restore_Summary} = < Klicken Sie auf die Restore Nummer (Restore#) für mehr Details. \$restoreStr
    Restore# Ergebnis Start Zeitpunkt Dauer/min #Dateien Größe/MB #tar Fehler #Xfer Fehler

    EOF $Lang{Archive_Summary} = < Klicken Sie auf die Archiv Nummer um die Details anzuzeigen. \$ArchiveStr
    Archiv# Ergebnis Start Zeitpunkt Dauer/min.

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Dokumentation"; $Lang{No} = "nein"; $Lang{Yes} = "ja"; $Lang{The_directory_is_empty} = <Das Verzeichnis \$dirDisplay ist leer. EOF #$Lang{on} = "an"; $Lang{off} = "aus"; $Lang{backupType_full} = "voll"; $Lang{backupType_incr} = "inkrementell"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "unvollständig"; $Lang{failed} = "fehler"; $Lang{success} = "erfolgreich"; $Lang{and} = "und"; # ------ # Hosts states and reasons $Lang{Status_idle} = "wartet"; $Lang{Status_backup_starting} = "Backup startet"; $Lang{Status_backup_in_progress} = "Backup läuft"; $Lang{Status_restore_starting} = "Wiederherstellung startet"; $Lang{Status_restore_in_progress} = "Wiederherstellung läuft"; $Lang{Status_admin_pending} = "Link steht an"; $Lang{Status_admin_running} = "Link läuft"; $Lang{Reason_backup_done} = "Backup durchgeführt"; $Lang{Reason_restore_done} = "Wiederherstellung durchgeführt"; $Lang{Reason_archive_done} = "Archivierung durchgeführt"; $Lang{Reason_nothing_to_do} = "kein Auftrag"; $Lang{Reason_backup_failed} = "Backupfehler"; $Lang{Reason_restore_failed} = "Wiederherstellungsfehler"; $Lang{Reason_archive_failed} = "Archivierungsfehler"; $Lang{Reason_no_ping} = "nicht erreichbar"; $Lang{Reason_backup_canceled_by_user} = "Abbruch durch Benutzer"; $Lang{Reason_restore_canceled_by_user} = "Abbruch durch Benutzer"; $Lang{Reason_archive_canceled_by_user} = "Archivierung abgebrochen durch Benutzer"; $Lang{Disabled_OnlyManualBackups} = "autom. deaktiviert"; $Lang{Disabled_AllBackupsDisabled} = "deaktiviert"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: keine Backups von \$host waren erfolgreich"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Hallo $userName, Ihr Computer ($host) wurde durch den Backupserver noch nie erfolgreich gesichert. Backups sollten automatisch erfolgen, wenn Ihr Computer am Netzwerk angeschlossen ist. Sie sollten Ihren Backup-Betreuer oder den IT-Dienstleister kontaktieren, wenn: - Ihr Computer regelmäßig am Netzwerk angeschlossen ist. Dann handelt es sich um ein Installations- bzw. Konfigurationsproblem, was die Durchführung von automatischen Backups verhindert. - Wenn Sie kein automatisches Backup des Computers brauchen und diese E-Mail nicht mehr erhalten möchten. Andernfalls sollten Sie sicherstellen, dass Ihr Computer regelmäßig korrekt am Netzwerk angeschlossen wird. Mit freundlichen Grüßen Ihr BackupPC Server https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: keine neuen Backups für Computer \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Hallo $userName, Ihr Computer ($host) wurde seit $days Tagen nicht mehr erfolgreich gesichert. Ihr Computer wurde von vor $firstTime Tagen bis vor $days Tagen $numBackups mal erfolgreich gesichert. Backups sollten automatisch erfolgen, wenn Ihr Computer am Netzwerk angeschlossen ist. Wenn Ihr Computer in den letzten $days Tagen mehr als ein paar Stunden am Netzwerk angeschlossen war, sollten Sie Ihren Backup-Betreuer oder den IT-Dienstleister kontaktieren um die Ursache zu ermitteln und zu beheben. Andernfalls, wenn Sie z.B. lange Zeit nicht im Büro sind, können Sie höchstens manuell Ihre Dateien sichern (evtl. kopieren auf eine externe Festplatte). Bitte denken Sie daran, dass alle in den letzten $days Tagen geänderten Dateien (z.B. auch E-Mails und Anhänge oder Datenbankeinträge) verloren gehen falls Ihre Festplatte ausfällt oder Dateien durch versehentliches Löschen oder Virenbefall unbrauchbar werden. Mit freundlichen Grüßen Ihr BackupPC Server https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupServer: Outlook-Dateien auf Computer \$host - Sicherung erforderlich"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Hallo $userName, die Outlook Dateien auf Ihrem Computer wurden $howLong Tage nicht gesichert. Diese Dateien enthalten Ihre E-Mails, Anhänge, Adressen und Kalender. Ihr Computer wurde zwar $numBackups mal seit $firstTime Tagen bis vor $lastTime Tagen gesichert. Allerdings sperrt Outlook den Zugriff auf diese Dateien. Es wird folgendes Vorgehen empfohlen: 1. Der Computer muss an das BackupServer-Netzwerk angeschlossen sein. 2. Beenden Sie Outlook. 3. Starten Sie ein inkrementelles Backup mit dem Internet-Browser hier: $CgiURL?host=$host Name und Passwort eingeben und dann zweimal nacheinander auf "Starte inkrementelles Backup" klicken Klicken Sie auf "Gehe zurück zur ...Hauptseite" und beobachten Sie den Status des Backupvorgangs (Browser von Zeit zu Zeit aktualisieren). Das sollte je nach Dateigröße nur eine kurze Zeit dauern. Mit freundlichen Grüßen Ihr BackupPC Server https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "Backup nicht erfolgreich"; $Lang{howLong_not_been_backed_up_for_days_days} = "Kein Backup seit \$days Tagen"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS Feed für BackupPC"; $Lang{RSS_Host_Summary} = < Beachte: Wähle Überschreiben, wenn du einen computerspezifischen Wert verändern willst

    EOF $Lang{CfgEdit_Button_Save} = "Speichern"; $Lang{CfgEdit_Button_Insert} = "Einfügen"; $Lang{CfgEdit_Button_Delete} = "Löschen"; $Lang{CfgEdit_Button_Add} = "Hinzufügen"; $Lang{CfgEdit_Button_Override} = "Überschreiben"; $Lang{CfgEdit_Button_New_Key} = "Neuer Schlüssel"; $Lang{CfgEdit_Button_New_Share} = "Neuer ShareName oder '*'"; $Lang{CfgEdit_Error_No_Save} = "Wegen Fehlern nicht gesichert"; $Lang{CfgEdit_Error__must_be_an_integer} = "Fehler: \$var muss eine Zahl sein"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Fehler: \$var muss eine ganze Zahl sein"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Fehler: \$var Eintrag \$k muss eine Zahl sein"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Fehler: \$var Eintrag \$k muss eine ganze Zahl sein"; $Lang{CfgEdit_Error__must_be_executable_program} = "Fehler: \$var muss ein gültiger ausführbarer Pfad sein"; $Lang{CfgEdit_Error__must_be_valid_option} = "Fehler: \$var muss eine gültige Option sein"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Ursprungshost \$copyHost existiert nicht; Erstelle den vollen Hostnamen \$fullHost. Lösche den Host wenn das nicht war, was du wolltest."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User hat die Konfiguration vom Host \$fromHost zu \$host kopiert\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User hat \$p von \$conf gelöscht\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User hat \$p zu \$conf hinzugefügt und den Wert \$value gegeben\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User änderte \$p in \$conf zu \$valueNew von \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User hat den Host \$host gelöscht\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User Host \$host hat den Schlüssel \$key von \$valueOld zu \$valueNew geändert\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User hat den Host \$host: \$value hinzugefügt\n"; #end of lang_de.pm BackupPC-4.4.0/lib/BackupPC/Lang/nl.pm0000444000047500004750000017033213673511776016163 0ustar craigcraig#!/usr/bin/perl # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; #File: nl.pm version 1.5 # -------------------------------- $Lang{Start_Archive} = "Start Archivering"; $Lang{Stop_Dequeue_Archive} = "Stop/Annuleer Archivering"; $Lang{Start_Full_Backup} = "Start volledige backup"; $Lang{Start_Incr_Backup} = "Start incrementele backup"; $Lang{Stop_Dequeue_Backup} = "Stop/Annuleer backup"; $Lang{Restore} = "Herstellen"; $Lang{Type_full} = "volledig"; $Lang{Type_incr} = "incrementeel"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Alleen gebruikers met bijzondere rechten kunnen admin.-opties bekijken."; $Lang{H_Admin_Options} = "BackupPC Server: Admin Opties"; $Lang{Admin_Options} = "Admin Opties"; $Lang{Admin_Options_Page} = < \${h2("Besturing van de server")}

    Herlaad de configuratie van de server:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Verbinding met de BackupPC server is mislukt"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < De foutmelding was: \$err.
    Mogelijk draait de BackupPC server niet of is er een configuratiefout. Gelieve dit te melden aan uw systeembeheerder. EOF $Lang{Admin_Start_Server} = < De BackupPC-server op \$Conf{ServerHost} poort \$Conf{ServerPort} werkt momenteel niet (misschien hebt u hem juist gestopt, of nog niet gestart).
    Wilt u de server nu starten? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Overzicht BackupPC Server"; $Lang{BackupPC_Server_Status_General_Info} = <
  • De PID (procesidentificatie) van de server is \$Info{pid}, op machine \$Conf{ServerHost}, versie \$Info{Version}, gestart op \$serverStartTime.
  • Dit overzicht werd gemaakt op \$now.
  • De configuratie werd het laatst ingelezen op \$configLoadTime.
  • Volgende backupsessie start op \$nextWakeupTime.
  • Andere informatie:
    • \$numBgQueue wachtende backupaanvragen sinds laatste geplande wakeup,
    • \$numUserQueue wachtende backupaanvragen van gebruikers,
    • \$numCmdQueue wachtende opdrachten, \$poolInfo
    • Het backup filesystem werd recentelijk aangevuld voor \$Info{DUlastValue}% op (\$DUlastTime), het maximum van vandaag is \$Info{DUDailyMax}% (\$DUmaxTime) en het maximum van gisteren was \$Info{DUDailyMaxPrev}%.
    • Het backup filesystem inode werd recentelijk aangevuld voor \$Info{DUInodelastValue}% op (\$DUlastTime), het maximum van vandaag is \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) en het maximum van gisteren was \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Momenteel lopende jobs")}

    \$jobStr
    Machine Type Gebruiker Starttijd Opdracht PID PID vd overdracht Status Count

    \$generalInfo \${h2("Opgetreden fouten die aandacht vragen")}

    \$statusStr
    Machine Type Gebruiker Laatste poging Details Fouttijd Laatste fout (verschillend van 'geen ping')
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Overzicht machines"; $Lang{BackupPC__Archive} = "BackupPC: Archivering"; $Lang{BackupPC_Summary} = <

    • Dit overzicht dateert van \$now.
    • Het backup filesystem werd recentelijk aangevuld voor \$Info{DUlastValue}% op (\$DUlastTime), het maximum van vandaag is \$Info{DUDailyMax}% (\$DUmaxTime) en het maximum van gisteren was \$Info{DUDailyMaxPrev}%.
    • Het backup filesystem inode werd recentelijk aangevuld voor \$Info{DUInodelastValue}% op (\$DUlastTime), het maximum van vandaag is \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) en het maximum van gisteren was \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Machine(s) met geslaagde backups")}

    Er zijn \$hostCntGood hosts gebackupt, wat een totaal geeft van:

    • \$fullTot volledige backups met een totale grootte van \${fullSizeTot}GiB (voor samenvoegen),
    • \$incrTot oplopende backups met een totale grootte van \${incrSizeTot}GiB (voor samenvoegen).

    \$strGood
    Machine Gebruiker Commentaar Aantal Voll. Voll.Lftd (dagen) Voll.Grootte (GiB) Snelheid (MB/sec) Aantal Incr. Incr.Lftd (dagen) Vorige Backup (dagen) Status Aantal fouten Laatste poging
    \${h2("Hosts zonder backups")}

    Er zijn \$hostCntNone hosts zonder backup.

    \$strNone
    Machine Gebruiker Commentaar Aantal Voll. Voll.Lftd (dagen) Voll.Grootte (GiB) Snelheid (MB/sec) Aantal Incr. Incr.Lftd (dagen) Vorige Backup (dagen) Status Aantal fouten Laatste poging
    EOF $Lang{BackupPC_Archive} = < Er zijn \$hostCntGood machines gebackupt die een totale grootte vertegenwoordigen van \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Machine Gebruiker Backupgrootte

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Plaats van archivering /device EOF $Lang{BackupPC_Archive2_compression} = < Compressie Geen
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Pariteitspercentage (0 = geen, 5 = standaard) EOF $Lang{BackupPC_Archive2_split} = < Opdelen (splitsen) in Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <Gebruikte backupschijfruimte is \${poolSize}GiB groot en bevat \$info->{"\${name}FileCnt"} bestanden en \$info->{"\${name}DirCnt"} mappen (op \$poolTime),
  • Schijfruimte bevat \$info->{"\${name}FileCntRep"} bestanden met identieke hashcodes (langste reeks is \$info->{"\${name}FileRepMax"},
  • Nachtelijke opruiming verwijderde \$info->{"\${name}FileCntRm"} bestanden met een grootte van \${poolRmSize}GiB (ongeveer \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: backup aangevraagd van \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Antwoord van server was: \$reply

    Terug naar \$host hoofdpagina. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Bevestiging start van de backup van \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Met deze actie start u een \$type backup van machine \$host.

    Wilt u dat nu doen?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Bevestiging de annulering van de backup van \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Met deze actie annuleert u de backup van pc \$host of haalt u de opdracht uit de wachtrij;
    Start bovendien geen andere backup gedurende uur/uren.

    Wilt u dit nu bevestigen?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Enkel gebruikers met bijzondere rechten kunnen de wachtrij bekijken."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Enkel gebruikers met bijzondere rechten kunnen archiveren."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: overzicht wachtrij"; # -------------------------------- $Lang{Backup_Queue_Summary} = < Deze aanvragen van gebruikers staan momenteel in de wachtrij:

    \$strUser
    Machine Action Aanvraagtijd Gebruiker
    \${h2("Overzicht Wachtrij: in achtergrond")}

    Deze aanvragen voor backups in de achtergrond staan momenteel in de wachtrij:

    \$strBg
    Machine Action Aanvraagtijd Gebruiker
    \${h2("Overzicht Wachtrij: Opdrachten")}

    Deze aanvragen via opdracht staan momenteel in de wachtrij:

    \$strCmd
    Machine Action Aanvraagtijd Gebruiker Opdracht
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Bestand \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, gewijzigd \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ \$skipped regels overgeslagen ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nKan het logbestand \$file niet openen \n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Geschiedenis Logbestand";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Bestand Grootte Laatste wijziging
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Bestemming Machine Tijd Onderwerp
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Overzicht backup nummer \$num van pc \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Opties voor het herstellen van bestanden van machine \$host"; $Lang{Restore_Options_for__host2} = < U hebt de volgende bestanden/mappen geselecteerd uit \$share, backup nummer #\$num:
      \$fileListStr

    Er zijn drie mogelijkheden om deze bestanden/mappen terug te herstellen. Gelieve een van de onderstaande mogelijkheden te kiezen.

    \${h2("Optie 1: Rechtstreeks herstellen")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Waarschuwing: bestaande bestanden met dezelfde naam zullen overschreven worden!

    \$hiddenStr
    Zet de bestanden terug naar de pc
    Plaats de bestanden terug in de map (share)
    Plaats de bestanden onder de map
    (relatief tov share)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Optie 2: Download een Zip-bestand")}

    U kan een Zip-bestand downloaden dat al de bestanden/mappen bevat die u hebt geselecteerd. U kan dan een applicatie op uw pc, zoals WinZip, gebruiken om de bestanden te bekijken of uit te pakken.

    Waarschuwing: Afhankelijk van welke bestanden u geselecteerd hebt, kan dit zip-bestand zeer zeer groot zijn. Het kan meerdere minuten duren om dit bestand aan te maken en het te downloaden. Uw pc moet ook over voldoende harde schijfruimte beschikken om het bestand te kunnen bevatten.

    \$hiddenStr Maak het zip-archief relatief aan \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (in het andere geval zal het archiefbestand volledige padnamen bevatten).
    Compressie (0=uit, 1=snel,...,9=hoogst)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Optie 2: Download Zip-bestand")}

    Archive::Zip is niet geïnstalleerd op de backupPC-server en het is dus niet mogelijk om een Zip-bestand te downloaden. Gelieve aan uw systeembeheerder te vragen om Archive::Zip te downloaden van www.cpan.org en te installeren.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < U kan een tar-bestand downloaden dat alle bestanden/mappen bevat die u geselecteerd hebt. U kan dan een applicatie op uw pc, zoals tar of WinZip, gebruiken om de bestanden te bekijken of uit te pakken.

    Waarschuwing: Afhankelijk van welke bestanden/mappen u geselecteerd hebt kan dit bestand zeer, zeer groot worden. Het kan verscheidene minuten duren om het tar-bestand de maken en te downloaden. Uw pc dient over voldoende vrije schijfruimte te beschikken om het bestand op te slaan.

    \$hiddenStr Maak het tar-archief relatief aan \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (anders zal het tar-archief volledige padnamen bevatten).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Bevestig herstellen voor machine \$host"; $Lang{Are_you_sure} = < U hebt gevraagd om bestanden rechtstreeks terug te zetten op de machine \$In{hostDest}. De volgende bestanden zullen hersteld worden in share \$In{shareDest}, uit backup nummer \$num:

    \$fileListStr
    Oorspronkelijk bestand/mapzal hersteld worden in

    \$hiddenStr Is dit wat u wilt doen? Gelieve te bevestigen.
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Herstellen aangevraagd van machine \$hostDest"; $Lang{Reply_from_server_was___reply} = < Het antwoord van de server was: \$reply

    Ga terug naar \$hostDest homepagina. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Het antwoord van de server was: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Overzicht backup van machine \$host"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Acties door de gebruiker")}

    \$startIncrStr

    \${h2("Backup overzicht")}

    Klik op het backupnummer om de inhoud te bekijken of om bestanden te herstellen.

    \$deleteHdrStr \$str
    backup nr. Type Aangevuld Niveau Startdatum Duurtijd in min. Lftd. in dagen Houden Commentaar

    \$restoreStr

    \${h2("Overzicht van fouten tijdens overdracht")} \$errStr
    backup nr. Type Bekijken Aantal fouten Aantal foutieve bestanden Aantal foutieve \'shares\' Aantal tar-fouten
    \${h2("Overzicht bestandsgrootte en hergebruik")}

    Bestaande bestanden zijn bestanden die reeds aanwezig waren op de backupschijf. Nieuwe bestanden zijn bestanden die aan de schijf zijn toegevoegd. Lege bestanden en SMB-fouten worden niet geteld in de aantallen \'hergebruik\' en \'nieuw\'.

    \$sizeStr
    Totalen Bestaande bestanden Nieuwe bestanden
    Backup nr. Type Aantal best. Grootte in MB MB/sec Aantal best. Grootte in MB Aantal best. Grootte in MB
    \${h2("Overzicht compressie")}

    Compressie van bestanden die reeds op schijf stonden en van nieuw gecomprimeerde bestanden.

    \$compStr
    Bestaande bestanden Nieuwe bestanden
    backup nr. Type Comp.niveau Grootte in MB Comp.in MB Comp. Grootte in MB Comp.in MB Comp.
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Overzicht archivering machine \$host"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Acties van de gebruiker")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Fout"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Server"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • U bekijkt nu backup nummer \$num, die gestart werd rond \$backupTime (\$backupAge dagen geleden), \$filledBackup
    • Ga naar map:
    • Commentaar:
    • Klik op een map hieronder om de inhoud van die map te bekijken,
    • Klik op een bestand hieronder om dat bestand terug te zetten.
    • U kan de backupgeschiedenis bekijken van de huidige map. \$share2pathStr
    \${h2("Inhoud van \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Toewijzing van sharenaam aan echt cliëntpad (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Geschiedenis van een map van backup van \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "map"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Deze geschiedenis toont elke unieke versie van de bestanden over alle backups heen:
    • Klik op een backupnummer om terug te keren naar het overzicht van de backup,
    • Klik op een map-link (\$Lang->{DirHistory_dirLink}) om door die map te bladeren,
    • Klik op de versie-link van een bestand (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) om dat bestand te downloaden,
    • Bestanden met dezelfde inhoud maar in verschillende backups hebben hetzelfde versienummer (PleaseTranslateThis: except between v3 and v4 backups),
    • Bestanden of mappen die in een bepaalde backup niet aanwezig zijn hebben een lege cel.
    • Bestanden met hetzelfde versienummer kunnen wel verschillende attributen (eigenaar,lees- of schrijfrechten) hebben.Selecteer het backupnummer om de attributen van het bestand te bekijken.
    \${h2("Geschiedenis van \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    backup nummer
    backup moment
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Details van herstel nr. #\$num van machine \$host"; $Lang{Restore___num_details_for__host2} = <
    Nummer \$Restores[\$i]{num}
    Aangevraagd door \$RestoreReq{user}
    Aanvraagtijd \$reqTime
    Resultaat \$Restores[\$i]{result}
    Foutmelding \$Restores[\$i]{errorMsg}
    Bronmachine \$RestoreReq{hostSrc}
    Bron backupnr. \$RestoreReq{num}
    Bron share \$RestoreReq{shareSrc}
    Bestemmingsmachine \$RestoreReq{hostDest}
    Bestemmingsshare \$RestoreReq{shareDest}
    Starttijd \$startTime
    Duur \$duration min
    Aantal bestanden \$Restores[\$i]{nFiles}
    Totale grootte \${MB} MB
    Overdrachtssnelheid \$MBperSec MB/sec
    TarCreate fouten \$Restores[\$i]{tarCreateErrs}
    Overdrachtsfouten \$Restores[\$i]{xferErrs}
    Logbestand overdracht Bekijken, Fouten

    \${h1("Lijst bestanden/mappen")}

    \$fileListStr
    Oorspronkelijk bestand/maphersteld naar
    EOF # ----------------------------------- $Lang{Archive___num_details_for__host} = "BackupPC: Details van archivering nr. \$num van \$host"; $Lang{Archive___num_details_for__host2} = <
    Nummer \$Archives[\$i]{num}
    Aangevraagd door \$ArchiveReq{user}
    Aanvraagtijd \$reqTime
    Resultaat \$Archives[\$i]{result}
    Foutmelding \$Archives[\$i]{errorMsg}
    Starttijd \$startTime
    Duur \$duration min
    Logbestand overdracht Bekijken, Fouten

    \${h1("Machinelijst")}

    \$HostListStr
    Machinebackup nr.
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Overzicht E-mail"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new mislukt: controleer de apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Foutieve gebruiker: mijn userid is \$>, in plaats van \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Enkel gebruikers met bijzondere rechten kunnen PC-overzichten bekijken."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Enkel gebruikers met bijzondere rechten kunnen backups stoppen of starten van machine \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Ongeldig of onjuist nummer \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Ik kan \$file niet openen: misschien problemen met de configuratie?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Enkel gebruikers met bijzondere rechten kunnen log- of configuratiebestanden bekijken."; $Lang{Only_privileged_users_can_view_log_files} = "Enkel gebruikers met bijzondere rechten kunnen logbestanden bekijken."; $Lang{Only_privileged_users_can_view_email_summaries} = "Enkel gebruikers met bijzondere rechten kunnen het e-mailoverzicht bekijken."; $Lang{Only_privileged_users_can_browse_backup_files} = "Enkel gebruikers met bijzondere rechten kunnen de backup van machine \${EscHTML(\$In{host})} bekijken."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Geen of lege machinenaam."; $Lang{Directory___EscHTML} = "Map \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} is leeg"; $Lang{Can_t_browse_bad_directory_name2} = "Kan niet bladeren door foutieve mapnaam \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Enkel gebruikers met bijzondere rechten kunnen backups van machine \${EscHTML(\$In{host})} terugzetten."; $Lang{Bad_host_name} = "Foutieve of ongeldige machinenaam \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "U hebt geen enkel bestand geselecteerd. Gelieve terug te gaan en selecteer een of meerdere bestanden."; $Lang{You_haven_t_selected_any_hosts} = "U hebt geen machine geselecteerd. Gelieve terug te gaan om een machine te selecteren."; $Lang{Nice_try__but_you_can_t_put} = "Leuk geprobeerd, maar u kan geen \'..\' in de bestandsnamen plaatsen"; $Lang{Host__doesn_t_exist} = "Machine \${EscHTML(\$In{hostDest})} bestaat niet."; $Lang{You_don_t_have_permission_to_restore_onto_host} = "U beschikt niet over de juiste rechten om bestanden te herstellen naar machine \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Ik kan \${EscHTML(\"\$openPath\")} niet openen of aanmaken"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Alleen gebruikers met bijzondere rechten kunnen bestanden herstellen naar machine \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Lege machinenaam"; $Lang{Unknown_host_or_user} = "Onbekende machine of gebruiker \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Enkel gebruikers met bijzondere rechten kunnen informatie over machine \${EscHTML(\$host)} bekijken."; $Lang{Only_privileged_users_can_view_archive_information} = "Enkel gebruikers met bijzondere rechten kunnen archiveringsinformatie bekijken."; $Lang{Only_privileged_users_can_view_restore_information} = "Enkel gebruikers met bijzondere rechten kunnen herstelinformatie bekijken."; $Lang{Restore_number__num_for_host__does_not_exist} = "Herstel nr.\$num van machine \${EscHTML(\$host)} bestaat niet."; $Lang{Archive_number__num_for_host__does_not_exist} = "Archiveringsnr. \$num van machine \${EscHTML(\$host)} bestaat niet."; $Lang{Can_t_find_IP_address_for} = "Ik kan het IP-adres van \${EscHTML(\$host)} niet vinden."; $Lang{host_is_a_DHCP_host} = < In afwachting dat ik machine \$host op een bepaald DHCP-adres terugvind, kan u deze aanvraag enkel doen vanaf die machine zelf. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "backup aangevraagd van DHCP \$host (\$In{hostIP}) door \$User vanaf \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "backup aangevraagd van \$host door \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "backup geannuleerd van \$host door \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Herstel aangevraagd voor machine \$hostDest, backup nr.\$num, door \$User vanaf \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Archivering aangevraagd door \$User vanaf \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Status"; $Lang{PC_Summary} = "Overzicht machine"; $Lang{LOG_file} = "LOG-bestand"; $Lang{LOG_files} = "LOG-bestanden"; $Lang{Old_LOGs} = "Oude LOGs"; $Lang{Email_summary} = "E-mailoverzicht"; $Lang{Config_file} = "Configuratiebest."; # $Lang{Hosts_file} = "Hosts-bestand"; $Lang{Current_queues} = "Huidige wachtrij"; $Lang{Documentation} = "Documentatie"; #$Lang{Host_or_User_name} = "Machine of gebruikersnaam:"; $Lang{Go} = "Start"; $Lang{Hosts} = "Machines"; $Lang{Select_a_host} = "Selecteer een machine..."; $Lang{There_have_been_no_archives} = "

    Er waren (nog) geen archiveringen

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Deze PC werd (nog) nooit gebackupt !!

    \n"; $Lang{This_PC_is_used_by} = "
  • Deze PC wordt gebruikt door \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Enkel de foutmeldingen)"; $Lang{XferLOG} = "OverdrachtsLOG"; $Lang{Errors} = "Foutmeldingen"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Meest recente e-mail die gezonden werd naar \${UserLink(\$user)} was op \$mailTime, onderwerp: "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <De opdracht \$cmd loopt momenteel voor machine \$host sedert \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <Machine \$host staat klaar in de wachtrij \'achtergrond\' (backup zal weldra starten). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Machine \$host staat in de gebruikers-wachtrij (backup zal weldra starten). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Een opdracht voor machine \$host staat in de opdrachtenwachtrij (opdracht zal weldra starten). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Meest recente status is \"\$Lang->{\$StatusHost{state}}\"\$reason sedert \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <Meest recente foutmelding was \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Pings naar machine \$host zijn \$StatusHost{deadCnt} opeenvolgende keren mislukt. EOF # ----- $Lang{Prior_to_that__pings} = "Daarvoor, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr naar machine \$host zijn \$StatusHost{aliveCnt} opeenvolgende keren geslaagd. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Omdat machine \$host op het netwerk was gedurende minstens \$Conf{BlackoutGoodCnt} opeenvolgende keren, zal hij niet gebackupt worden van \$blackoutStr EOF $Lang{__time0_to__time1_on__days} = "\$t0 tot \$t1 op \$days."; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <backups zijn \$hours uren uitgesteld (Wijzig dit aantal). EOF $Lang{tryIP} = " en \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Machine \$In{host}"; $Lang{checkAll} = <  Selecteer alles EOF $Lang{checkAllHosts} = <  Selecteer alles EOF $Lang{fileHeader} = < Naam Type Mode Nr. Grootte Wijziging EOF $Lang{Home} = "Home"; $Lang{Browse} = "Bekijken backups"; $Lang{Last_bad_XferLOG} = "Laaste overdr.LOG met fouten"; $Lang{Last_bad_XferLOG_errors_only} = "Laaste overdr.LOG (enkel foutmeldingen)"; $Lang{This_display_is_merged_with_backup} = < Dit overzicht is samengevoegd met backup #\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Selecteer de backup die u wil bekijken: EOF $Lang{Restore_Summary} = < Klik op het nummer voor meer details. \$restoreStr
    Herstel nr. Resultaat Startdatum Duur(min.) Aantal best. MB Aantal tar-fouten Aantal Overdr.fouten

    EOF $Lang{Archive_Summary} = < Klik op het archiveringsnummer voor meer details. \$ArchiveStr
    Archiveringsnr. Resultaat Startdatum Duur/min

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentatie"; $Lang{No} = "nee"; $Lang{Yes} = "ja"; $Lang{The_directory_is_empty} = <De map/directory \$dirDisplay is leeg EOF #$Lang{on} = "aan"; $Lang{off} = "uit"; $Lang{backupType_full} = "volledig"; $Lang{backupType_incr} = "incrementeel"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "gedeeltelijk"; $Lang{failed} = "mislukt"; $Lang{success} = "succesvol"; $Lang{and} = "en"; # ------ # Hosts states and reasons $Lang{Status_idle} = "inactief"; $Lang{Status_backup_starting} = "backup start"; $Lang{Status_backup_in_progress} = "backup bezig"; $Lang{Status_restore_starting} = "herstel start"; $Lang{Status_restore_in_progress} = "herstel bezig"; $Lang{Status_admin_pending} = "wacht op linken"; $Lang{Status_admin_running} = "linken is bezig"; $Lang{Reason_backup_done} = "backup voltooid"; $Lang{Reason_restore_done} = "herstel voltooid"; $Lang{Reason_archive_done} = "archivering voltooid"; $Lang{Reason_nothing_to_do} = "niets te doen"; $Lang{Reason_backup_failed} = "backup mislukt"; $Lang{Reason_restore_failed} = "herstel mislukt"; $Lang{Reason_archive_failed} = "archivering mislukt"; $Lang{Reason_no_ping} = "geen ping"; $Lang{Reason_backup_canceled_by_user} = "backup geannuleerd door gebruiker"; $Lang{Reason_restore_canceled_by_user} = "herstellen geannuleerd door gebruiker"; $Lang{Reason_archive_canceled_by_user} = "archivering geannuleerd door gebruiker"; $Lang{Disabled_OnlyManualBackups} = "auto uitgeschakeld"; $Lang{Disabled_AllBackupsDisabled} = "uitgeschakeld"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: Er werd (nog) geen backup gemaakt van pc \$host"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Beste $userName, Uw pc ($host) is tot op heden nog nooit succesvol gebackupt door onze PC backup software. PC backups zouden automatisch moeten gebeuren als uw pc verbonden is met het netwerk. U kan best contact opnemen met de systeembeheerder als: - Uw pc regelmatig en normaal verbonden was met het netwerk. Mogelijk is er immers een configuratie of setupfout waardoor backups niet mogelijk waren/zijn. - U helemaal geen backup wenst van deze pc en u wil dat er hierover geen e-mail meer gezonden worden In andere gevallen dient u er voor te zorgen dat uw pc zo spoedig mogelijk verbonden wordt met het netwerk. In geval van twijfel of voor hulp kan u contact opnemen met de systeembeheerder. Met vriendelijke groeten, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: er zijn recentelijk geen backups (meer) gemaakt van pc \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Beste $userName, Er is reeds gedurende $days dagen geen backup meer gemaakt van uw pc ($host). Er zijn ondertussen van uw pc $numBackups backups gemaakt sinds $firstTime dagen geleden. De laatste backup dateert van $days dagen geleden. PC backups zouden automatisch moeten gebeuren als uw pc verbonden is met het netwerk. Als uw pc gedurende geruime tijd (meer dan een paar uur) verbonden was met het netwerk gedurende de laatste $days dagen, kan u het beste contact opnemen van uw systeembeheerder. Vraag hem of haar om uit te zoeken waarom er geen backups meer gemaakt worden van uw pc. Anderzijds, als deze pc of notebook zich momenteel niet in het netwerk bevindt dan kan u hieraan weinig anders doen behalve van belangrijke bestanden handmatig een kopie te maken op een ander medium (CD, diskette, tape, andere pc,...) U dient te weten dat *geen enkel bestand* dat u aanmaakte of wijzigde in de laatste $days dagen hersteld zal kunnen worden in geval de harde schijf van uw pc zou crashen. Hierin zijn nieuwe e-mail en bijlagen inbegrepen. Met vriendelijke groeten, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlookbestanden op pc \$host moeten gebackupt worden"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Beste $userName, De Outlookbestanden van uw pc zijn $howlong. Deze bestanden bevatten al uw e-mail, bijlagen, contactadressen en agenda. Uw pc werd reeds $numBackups keer succesvol gebackupt sinds $firstTime tot $lastTime dagen geleden. Helaas, wanneer Outlook geopend is, worden al de bijhorende bestanden ontoegankelijk gemaakt voor andere programma's, inclusief het programma backupPC. Hierdoor kon van deze bestanden geen backup gemaakt worden. Als u nu verbonden bent met het netwerk, wordt U aangeraden om een backup te maken van de Outlookbestanden. Dat kan op volgende manier: - Sluit Outlook - Sluit bij voorkeur ook alle andere toepassingen - open uw browser en ga naar deze link: $CgiURL?host=$host - Kies dan voor "Start incrementele backup" tweemaal om zo een incrementele backup te starten. U kan klikken op de link "Terug naar $host pagina" en vervolgens op "vernieuwen" om de status van de backup te bekijken. Het zou slechts enkele ogenblikken mogen vragen vooraleer de backup volledig is. Met vriendelijke groeten, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "(nog) niet succesvol gebackupt"; $Lang{howLong_not_been_backed_up_for_days_days} = "reeds sedert \$days dagen niet gebackupt"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < NB: Selecteer 'Overschrijven' als je een waarde wil wijzigen specifiek voor deze machine.

    EOF $Lang{CfgEdit_Button_Save} = "Bewaren"; $Lang{CfgEdit_Button_Insert} = "Invoegen"; $Lang{CfgEdit_Button_Delete} = "Verwijderen"; $Lang{CfgEdit_Button_Add} = "Toevoegen"; $Lang{CfgEdit_Button_Override} = "Overschrijven"; $Lang{CfgEdit_Button_New_Key} = "Nieuwe sleutel"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Fout: niet bewaard ten gevolge van fouten"; $Lang{CfgEdit_Error__must_be_an_integer} = "Fout: \$var moet een geheel getal zijn"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Fout: \$var moet een reële waarde (nummer) zijn"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Fout: \$var ingave \$k moet een geheel getal zijn"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Fout: \$var ingave \$k moet een reële waarde (nummer) zijn"; $Lang{CfgEdit_Error__must_be_executable_program} = "Fout: \$var moet een geldig uitvoerbaar pad zijn"; $Lang{CfgEdit_Error__must_be_valid_option} = "Fout: \$var is geen geldige optie"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Te kopiëren machine \$copyHost bestaat niet; Machine \$fullHost wordt aangemaakt. Verwijder deze machine indien dit niet is wat je wil."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User kopieerde de instellingen van machine \$fromHost naar \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User verwijderde \$p van \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User voegde \$p toe aan \$conf, met waarde \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User wijzigde \$p in \$conf van \$valueOld naar \$valueNew \n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User verwijderde machine \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User machine \$host wijzigde \$key van \$valueOld naar \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User voegde machine \$host toe: \$value\n"; #end of lang_nl.pm BackupPC-4.4.0/lib/BackupPC/Lang/pt_br.pm0000444000047500004750000016637313673511776016672 0ustar craigcraig#!/usr/bin/perl # # By Reginaldo Ferreira (23.07.2004 for V2.1.10) # # Edited by Rodrigo Real (22.06.2006) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "Iniciar backup"; $Lang{Stop_Dequeue_Archive} = "Parar/Cancelar backup"; $Lang{Start_Full_Backup} = "Iniciar Backup Completo"; $Lang{Start_Incr_Backup} = "Iniciar Backup Incremental"; $Lang{Stop_Dequeue_Backup} = "Parar/Cancelar Backup"; $Lang{Restore} = "Restaurar"; $Lang{Type_full} = "completo"; $Lang{Type_incr} = "incremental"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Somente superusuarios podem ver as opções de administração."; $Lang{H_Admin_Options} = "Servidor BackupPC: Opções de administração"; $Lang{Admin_Options} = "Opções de administração"; $Lang{Admin_Options_Page} = < \${h2("Controle do Servidor")}

    Atualizar configurações do servidor:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Impossível conectar ao servidor BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < O erro foi: \$err.
    Talvez o servidor BackupPC não esteja ativo ou há um erro de configuração. Por favor informe o administrador do sistema. EOF $Lang{Admin_Start_Server} = < O servidor BackupPC em \$Conf{ServerHost} port \$Conf{ServerPort} não está iniciando (pode ter parado ou não ainda não iniciado).
    Deseja inicia-lo agora? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Estado do Servidor BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • O PID do servidor é \$Info{pid}, no host \$Conf{ServerHost}, versão \$Info{Version}, iniciado em \$serverStartTime.
  • Esta informação de estado foi gerada em \$now.
  • A última configuração foi carregada às \$configLoadTime
  • A fila de PCs se ativará novamente em \$nextWakeupTime.
  • Informações adicionais:
    • \$numBgQueue solicitações de backup pendentes desde a última ativação programada,
    • \$numUserQueue solicitações de backup de usuarios,
    • \$numCmdQueue solicitações de comandos pendentes, \$poolInfo
    • O sistema de arquivos estava recentemente em \$Info{DUlastValue}% (\$DUlastTime), o máximo de hoje é \$Info{DUDailyMax}% (\$DUmaxTime) e o máximo de ontem foi \$Info{DUDailyMaxPrev}%.
    • Inode O sistema de arquivos estava recentemente em \$Info{DUInodelastValue}% (\$DUlastTime), o máximo de hoje é \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) e o máximo de ontem foi \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Trabalhos em Execução")}

    \$jobStr
    Host Tipo Usuário Hora de Início Comando PID Transfer. PID Status Count

    \$generalInfo \${h2("Falhas que Precisam de Atenção")}

    \$statusStr
    Host Tipo Usuário Última Tentativa Detalhes Hora do erro Último erro (ping não incluido)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Resumo do Servidor"; $Lang{BackupPC__Archive} = "BackupPC: Archive"; $Lang{BackupPC_Summary} = <

    • Este status foi generado em \$now.
    • O sistema de arquivos estava recentemente em \$Info{DUlastValue}% (\$DUlastTime), o m?ximo de hoje ? \$Info{DUDailyMax}% (\$DUmaxTime) e o m?ximo de ontem foi \$Info{DUDailyMaxPrev}%.
    • Inode O sistema de arquivos estava recentemente em \$Info{DUInodelastValue}% (\$DUlastTime), o máximo de hoje é \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) e o máximo de ontem foi \$Info{DUInodeDailyMaxPrev}%.

    \${h2("Hosts com Backups Completos")}

    Existem \$hostCntGood hosts com backup, de um total de :

    • \$fullTot backups com tamanho total de \${fullSizeTot} GiB (antes de agrupar e comprimir),
    • \$incrTot backups incrementais com tamanho total de \${incrSizeTot} GiB (antes de agrupar e comprimir).

    \$strGood
    Host Usuario Comente #Completo Completo Antig. (Dias) Completo Tamanho (GiB) Velocidade (MB/sec) #Incrementais Incrementais Antig (Dias) ENG Last Backup (days) Estado Nº Xfer errs Última Tentativa
    \${h2("Hosts Sem Backups")}

    Existem \$hostCntNone hosts sem backups.

    \$strNone
    Host Usuario Comente #Completo Completo Antig. (Dias) Completo Tamanho (GiB) Velocidade (MB/sec) #Incrementais Incrementais Antig (Dias) ENG Last Backup (days) Estado Nº Xfer errs Última tentativa
    EOF $Lang{BackupPC_Archive} = < Existem \$hostCntGood hosts que possuem backup com tamanho total de \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host Usuário Tamanho Backup

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < Archive Localização/Dispositivo EOF $Lang{BackupPC_Archive2_compression} = < Compression None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < Porcentagem de dados de paridade (0 = desabilitado, 5 = normal) EOF $Lang{BackupPC_Archive2_split} = < Dividir resultado em Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <O pool de \${poolSize}GiB compreende \$info->{"\${name}FileCnt"} arquivos e \$info->{"\${name}DirCnt"} diretórios (as of \$poolTime),
  • O processamento do pool é de \$info->{"\${name}FileCntRep"} arquivos repetidos cuja cadeia maior é \$info->{"\${name}FileRepMax"},
  • O processo de limpeza noturna eliminou \$info->{"\${name}FileCntRm"} arquivos de \${poolRmSize}GiB (around \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Solicitação de Backup por \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < A resposta do servidor foi: \$reply

    Voltar a \$host home page. EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Confirme inicio do backup em \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Iniciando Backup \$type em \$host.

    Tem certeza desta ação?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Confirmação de Parada do Backup \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Você está certo de parar/sair da fila de backup em \$host;
    Assim mesmo, por favor não impessa outro backup durante horas.

    Tem certeza de que quer fazer isto?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Somente administradores podem ver as filas."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Somente administradores podem arquivar."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Resumo da Fila de Backup"; # -------------------------------- $Lang{Backup_Queue_Summary} = < As seguintes solicitações de usuários estão atualmente em fila:

    \$strUser
    Host Action Hora Sol. Usuário
    \${h2("Resumo da Fila em Segundo Plano")}

    As seguintes solicitações em segundo plano estão atualmente em fila:

    \$strBg
    Host Action Hora Sol. Usuário
    \${h2("Resumo da Fila de Comandos")}

    Os seguintes comandos estão atualmente em fila:

    \$strCmd
    Host Action Hora Sol. Usuário Comando
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: LOG de Registro \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, modificado \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ saltadas \$skipped linhas ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nNão pode-se abrir o LOG de registro \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: Histórico dos Logs de Registro";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    File Tamanho Hora Modificação
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Destinatário Host Hora Assunto
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: Explorar Backup \$num de \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: Opções de restauração para \$host"; $Lang{Restore_Options_for__host2} = < Foi selecionado os seguintes arquivos/diretórios da unidade \$share, cópia número #\$num:
      \$fileListStr

    Existem três opções para restaurar estes arquivos/diretórios. Por favor, selecione uma das seguintes opções.

    \${h2("Opção 1: Restauração Direta")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Atenção!: Qualquer arquivo existente com o mesmo nome que o que está selecionado será sobrescrito!

    \$hiddenStr
    Restaurar os arquivos no host
    Restaurar os arquivos na unidade
    Restaurar os arquivos abaixo no diretório
    (relativo a unidade)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Opção 2: Criar arquivo Zip")}

    Pode-se criar um arquivo comprimido (.zip) contendo todos os arquivos e diretórios que foram selecionados. Depois pode-se utilizar uma aplicação local, como WinZip, para ver ou extrair os arquivos.

    Atenção!: Dependendo de quais arquivos/pastas tenham sido selecionados, este arquivo pode ser muito grande. Poderia demorar muitos minutos para criar e transferir o arquivo. Também necessitará suficiente espaçio em disco local para armazená-lo.

    \$hiddenStr Fazer arquivo relativo a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (caso contrário o arquivo conterá os caminhos completos).
    Compressão (0=desativada, 1=rápida,...,9=máxima)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Opção 2: Criar arquivo Zip")}

    O programa Archive::Zip não está instalado, de modo que nã poderá criar um arquivo comprimido zip. Por favor, solicite ao seu administrador de sistemas que instale Archive::Zip de www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Pode-se criar um arquivo comprimido (.Tar) contendo todos os arquivos e diretórios que foram selecionados. Após pode-se utilizar uma aplicação local, como Tar ou WinZip, para ver ou extrair os arquivos gerados.

    Atenção!: Dependendo de quais arquivos/pastas foram selecionados, este arquivo pode ser muito grande. Poderia levar muitos minutos para criar e transferir o arquivo. Também necessitará suficiente espaço no disco local para armazená-lo.

    \$hiddenStr Criar um arquivo relativo a \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (caso contrário o arquivo conterá os caminhos completos).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: Confirme restauração em \$host"; $Lang{Are_you_sure} = < Está prestes a començar uma restauração diretamente na máquina \$In{hostDest}. Os seguintes arquivos serão restaurados na unidade \$In{shareDest}, a partir do Backup número \$num:

    \$fileListStr
    Arquivo/Dir Original Será restaurado em

    \$hiddenStr Tem certeza?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Restauração solicitada em \$hostDest"; $Lang{Reply_from_server_was___reply} = < A resposta do servidor foi: \$reply

    voltar a \$hostDest home page. EOF $Lang{BackupPC_Archive_Reply_from_server} = < A resposta do servidor foi: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Host \$host Resumo do Backup"; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Ações do Usuário")}

    \$startIncrStr

    \${h2("Resumo do Backup")}

    Clique no número do Backup para revisar e restaurar arquivos.

    \$deleteHdrStr \$str
    Cópia Nº Tipo Completo ENG Level Data Início Duração/min Idade/dias Guarda Comente

    \$restoreStr

    \${h2("Resumo dos Erros de Transferência")} \$errStr
    Copia Nº Tipo Ver Nº Xfer errs Nº erros arquivos Nº erros unidades Nº erros tar
    \${h2("Resumo do Total/Tamanho dos Arquivos Reutilizados")}

    Os arquivos existentes são aqueles que já estão no lote; os novos são aqueles que serão adicionados ao lote. Os arquivos vazios e os erros de SMB não contam nos valores de reutilizados nem nos de novos.

    \$sizeStr
    Totais Arquivos Existentes Arquivos Novos
    Cópia Nº Tipo Nº Arquivos Tamanho/MB MB/seg Nº Arquivos Tamanho/MB Nº Arquivos Tamanho/MB
    \${h2("Resumo da Compressão")}

    Performance de compresão para os arquivos já existentes no lote e nos arquivos novos comprimidos.

    \$compStr
    Arquivos Existentes Arquivos Novos
    Cópia Nº Tipo Nível Compr Tamanho/MB Compr/MB Compr Tamanho/MB Compr/MB Compr
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archive Summary"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Ações do usuário")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Erro"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Servidor"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • Revisando o Backup Nº\$num, que iniciou às \$backupTime (faz \$backupAge dias), \$filledBackup
    • Indique o diretório:
    • Comente:
    • Clique em um dos diretórios abaixo para revisar seus conteúdos,
    • Clique em um arquivo para restaurá-lo,
    • Ver o Backup history do diretório atual. \$share2pathStr
    \${h2("Conteúdo do \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mapeamento do nome do compartilhamento para o caminho do cliente real (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: Histórico do Backup do diretório em \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Este quadro mostra cada versão única disponível nos diversos backups:
    • Clique no número do backup para voltar ao explorador de backups,
    • Clique no atalho do diretório (\$Lang->{DirHistory_dirLink}) para navegar por esse diretório,
    • Clique no atalho da versão do arquivo (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) para baixar esse arquivo,
    • Os arquivos com conteúdos diferentes entre cópias distintas de backup tem o mesmo número de verssão (PleaseTranslateThis: except between v3 and v4 backups),
    • Os arquivos ou diretórios inexistentes em um determinado backup tem uma caixa vazia.
    • Os arquivos mostrados com a mesma versão podem ter diferentes atributos. Selecione o número do backup para ver os atributos do arquivo.
    \${h2("Histórico de \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Backup numero
    Backup time
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Detalhes da restauração Nº\$num de \$host"; $Lang{Restore___num_details_for__host2} = <
    Número \$Restores[\$i]{num}
    Solicitado por \$RestoreReq{user}
    Hora da Solicitação \$reqTime
    Resultado \$Restores[\$i]{result}
    Mensagem de Erro \$Restores[\$i]{errorMsg}
    Host Origem \$RestoreReq{hostSrc}
    Nº cópia origem \$RestoreReq{num}
    Unidade origem \$RestoreReq{shareSrc}
    Host destino \$RestoreReq{hostDest}
    Unidade destino \$RestoreReq{shareDest}
    Hora início \$startTime
    Duração \$duration min
    Número de arquivos \$Restores[\$i]{nFiles}
    Tamanho total \${MB} MB
    Taxa de transferência \$MBperSec MB/sec
    Erros de criação Tar \$Restores[\$i]{tarCreateErrs}
    Erros de transferência \$Restores[\$i]{xferErrs}
    Arquivo registro de transferência View, Errors

    \${h1("Lista de Arquivos/Diretórios")}

    \$fileListStr
    Dir/arquivo originalRestaurado a
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Archive #\$num Detalhes de \$host"; $Lang{Archive___num_details_for__host2} = <
    Número \$Archives[\$i]{num}
    Solicitado por \$ArchiveReq{user}
    Hora da solicitação \$reqTime
    Resultado \$Archives[\$i]{result}
    Mensagem de erro \$Archives[\$i]{errorMsg}
    Hora início \$startTime
    Duração \$duration min
    Arquivo registro Xfer View, Errors

    \${h1("Host list")}

    \$HostListStr
    HostBackup número
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Resumo de Emails"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->nova falha: revise o error_log do apache\n"; $Lang{Wrong_user__my_userid_is___} = "Usuário inválido: meu userid é \$>, no lugar de \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Somente os usuários autorizados podem ver os resumos de PCs."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Somente os usuários autorizados podem iniciar ou parar as cópias \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Número inválido \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Não pode abrir \$file: problema de configuração?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Somente os usuários autorizados podem ver registros ou arquivos de configuração."; $Lang{Only_privileged_users_can_view_log_files} = "Somente os usuários autorizados podem ver arquivos de registro."; $Lang{Only_privileged_users_can_view_email_summaries} = "Somente os usuários autorizados podem ver resumos de email."; $Lang{Only_privileged_users_can_browse_backup_files} = "Somente os usuários autorizados podem revisar os arquivos de backup for host \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Número de host vazio."; $Lang{Directory___EscHTML} = "O diretório \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} está vazio"; $Lang{Can_t_browse_bad_directory_name2} = "Não pode mostrar um nome de diretório inválido \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Somente os usuários autorizados podem restaurar backups para o host \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Nome de host inválido \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Não foi selecionado nenhum arquivo; por favor, volte e selecione alguns arquivos."; $Lang{You_haven_t_selected_any_hosts} = "Não foi selecionado nenhum host; por favor volte e selecione algum host."; $Lang{Nice_try__but_you_can_t_put} = "Boa tentativa, mas não pode usar \'..\' nos nomes de arquivo"; $Lang{Host__doesn_t_exist} = "O Host \${EscHTML(\$In{hostDest})} não existe"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "Sem autorização para restaurar neste host \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "Impossível abrir/criar \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Somente os usuários autorizados podem restaurar backups do host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Nome de host vazio"; $Lang{Unknown_host_or_user} = "Usuário ou host inválido \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Somente os usuários autorizados podem ver informações do host \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Somente os administradores podem ver informações de arquivo."; $Lang{Only_privileged_users_can_view_restore_information} = "Somente os usuários autorizados podem ver informações de restauração."; $Lang{Restore_number__num_for_host__does_not_exist} = "O número de restauração \$num del host \${EscHTML(\$host)} não existe."; $Lang{Archive_number__num_for_host__does_not_exist} = "O backup \$num do host \${EscHTML(\$host)} não existe."; $Lang{Can_t_find_IP_address_for} = "Impossível encontrar o endereço do IP de \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < Até que tenha \$host um endereço num DHCP válido, se pode començar este processo a partir da própria máquina cliente. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Solicitação de backup em DHCP \$host (\$In{hostIP}) por \$User desde \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Solicitação de backup em \$host por \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Backup parado/desprogramado em \$host por \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Restauração solicitada para o host \$hostDest, backup #\$num, por \$User desde \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Arquivo solicitado por \$User desde \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "Estado"; $Lang{PC_Summary} = "Resumo PC"; $Lang{LOG_file} = "Arquivo de Log"; $Lang{LOG_files} = "Arquivos de Log"; $Lang{Old_LOGs} = "Logs antigos"; $Lang{Email_summary} = "Resumo Email"; $Lang{Config_file} = "Arquivo configuração"; # $Lang{Hosts_file} = "Arquivo Hosts"; $Lang{Current_queues} = "Filas atuais"; $Lang{Documentation} = "Documentação"; #$Lang{Host_or_User_name} = "Host ou usuário:"; $Lang{Go} = "Aceitar"; $Lang{Hosts} = "Hosts"; $Lang{Select_a_host} = "Selecione um host..."; $Lang{There_have_been_no_archives} = "

    Não existem arquivos

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    Nunca foi feito backup deste PC!

    \n"; $Lang{This_PC_is_used_by} = "
  • Este PC é utilizado por \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Extraindo somente Erros)"; $Lang{XferLOG} = "TransfLOG"; $Lang{Errors} = "Erros"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <Última mensagem enviada a \${UserLink(\$user)} foi às \$mailTime, assunto "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <O comando \$cmd está executando para \$host, iniciado às \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <O host \$host está em fila para ser processado em segundo plano (logo o backup estará pronto!). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <Host \$host está para ser processado na fila de usuarios (logo o backup estará pronto!). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Uma execução para \$host estar na fila de execuções (iniciará a seguir). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <O último estado foi \"\$Lang->{\$StatusHost{state}}\"\$reason às \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <O último erro foi \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Os pings para \$host falharam \$StatusHost{deadCnt} vezes consecutivas. EOF # ----- $Lang{Prior_to_that__pings} = "Antes destes, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr a \$host obtiveram êxito \$StatusHost{aliveCnt} vezes consecutivas. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Dado que \$host tem estado em uso na rede pelo menos \$Conf{BlackoutGoodCnt} vezes consecutivas, não se realizará backup das \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 até \$t1 em \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Os backups atrazaram-se durante \$hours hours (Troque este número). EOF $Lang{tryIP} = " y \$StatusHost{dhcpHostIP}"; #$Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Selecionar tudo EOF $Lang{checkAllHosts} = <  Selecionar tudo EOF $Lang{fileHeader} = < Nome Tipo Modo Nº Tamanho Hora Mod. EOF $Lang{Home} = "Principal"; $Lang{Browse} = "Explorar backups"; $Lang{Last_bad_XferLOG} = "Último erro no Log de Transferência"; $Lang{Last_bad_XferLOG_errors_only} = "Último erro no Log de transferência (erros somente)"; $Lang{This_display_is_merged_with_backup} = < Este quadro pertence ao backup Nº\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Selecione o backup que desseja ver: EOF $Lang{Restore_Summary} = < Clique no número da restauração para ver seus detalhes. \$restoreStr
    Restauração Nº Resultado Data Inicio Dur/mins Nº Arquivos MB Nº Err. Tar Nº Err. Transf.#xferErrs

    EOF $Lang{Archive_Summary} = < Clique no número do arquivo para mais detalhes. \$ArchiveStr
    Archive# Resultado Hora início Dur/min

    EOF $Lang{BackupPC__Documentation} = "BackupPC: Documentação"; $Lang{No} = "não"; $Lang{Yes} = "sim"; $Lang{The_directory_is_empty} = <O diretório \$dirDisplay está vazio EOF #$Lang{on} = "ativo"; $Lang{off} = "inativo"; $Lang{backupType_full} = "completo"; $Lang{backupType_incr} = "incremental"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "parcial"; $Lang{failed} = "falhado"; $Lang{success} = "sucesso"; $Lang{and} = "e"; # ------ # Hosts states and reasons $Lang{Status_idle} = "inativo"; $Lang{Status_backup_starting} = "iniciando backup"; $Lang{Status_backup_in_progress} = "backup em execução"; $Lang{Status_restore_starting} = "iniciando restauração"; $Lang{Status_restore_in_progress} = "restauração em execução"; $Lang{Status_admin_pending} = "conexão pendente"; $Lang{Status_admin_running} = "conexão em curso"; $Lang{Reason_backup_done} = "backup realizado"; $Lang{Reason_restore_done} = "restauração realizada"; $Lang{Reason_archive_done} = "arquivamento realizado"; $Lang{Reason_nothing_to_do} = "nada a fazer"; $Lang{Reason_backup_failed} = "falha no backup"; $Lang{Reason_restore_failed} = "falha na restauração"; $Lang{Reason_archive_failed} = "falha no arquivamento"; $Lang{Reason_no_ping} = "sem ping"; $Lang{Reason_backup_canceled_by_user} = "backup cancelado pelo usuário"; $Lang{Reason_restore_canceled_by_user} = "restauração cancelada pelo usuário"; $Lang{Reason_archive_canceled_by_user} = "arquivamento cancelado pelo usuário"; $Lang{Disabled_OnlyManualBackups} = "ENG auto disabled"; $Lang{Disabled_AllBackupsDisabled} = "ENG disabled"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: nenhum backup de \$host foi terminado com êxito"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Caro $userName, Em seu PC ($host) nenhum backup foi completado por nosso programa de backup. Os backups deveriam ser executados automaticamente quando seu PC se conecta a rede. Contate seu suporte técnico se: - Seu computador está conectado a rede com regularidade. Isto significa que existe algum problema de instalação ou configuração que impessa a realização dos backups. - Não deseja realizar backups e não quer receber mais mensagens como esta. Caso contrário, assegure-se de que seu PC está conectado à rede na próxima vez que estiver utilizando-o. Saudações: Agente BackupPC https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: não existem backups recentes de \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Caro $userName, Não foi completado nenhum backup completo de seu PC ($host) durante $days dias. Seu PC tem realizado backups corretos $numBackups vezes desde $firstTime até $days dias. Os backups deveriam efetuar-se automaticamente quando seu PC estiver conectado a rede. Se seu PC tem estado conectado durante algumas horas a rede durante os últimos $days dias deveria contactar com seu suporte técnico para ver porque os backups não funcionam adequadamente. Por outro lado, se você não o está utilizando, não há muito o que fazer a não ser copiar manualmente os arquivos mais críticos para outro suporte físico. Deve-se estar ciente de que qualquer arquivo que tenha sido criado ou modificado nos últimos $days dias (incluindo todos os emails novos e arquivos anexos) não podem ser restaurados se seu disco danificar-se. Saudações: Agente BackupPC https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Oss arquivos do Outlook de \$host necessitam ser copiados"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Caro $userName, Os arquivos de Outlook de seu PC tem $howLong. Estes arquivos contém todo seus emails, anexos, contatos e informações de sua agenda. Seu PC tem sido corretamente salvaguardado $numBackups vezes desde $firstTime até $lastTime dias. Sem fechá-lo, Outlook bloqueia todos seus arquivos quando estão em execução, impidindo de se fazer backup dos mesmo. Recomendamos fazer cópia de segurança dos arquivos do Outlook quando estiver conectado a rede fechando o Outlook e o resto das aplicações e utilizando seu navegador de internet. Clique neste link: $CgiURL?host=$host Selecione "Começar backup incremental" duas vezes para começar um novo backup incremental. Pode-se selecionar "Voltar a página de $host " e clicar em "refazer" para ver o estado do processo de backup. Este processo deve durar somente alguns minutos para completar. Saudações: Agente BackupPC https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "não foi realizado nenhum backup com êxito"; $Lang{howLong_not_been_backed_up_for_days_days} = "não foi realizado nenhum backup durante \$days dias"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "Servidor BackupPC"; $Lang{RSS_Doc_Description} = "RSS feed do BackupPC"; $Lang{RSS_Host_Summary} = < Note: Marque Override se você quiser modificar um valor especificamente neste host.

    EOF $Lang{CfgEdit_Button_Save} = "Salvar"; $Lang{CfgEdit_Button_Insert} = "Inserir"; $Lang{CfgEdit_Button_Delete} = "Excluir"; $Lang{CfgEdit_Button_Add} = "Adicionar"; $Lang{CfgEdit_Button_Override} = "Sobrepor"; $Lang{CfgEdit_Button_New_Key} = "New Key"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "ENG Error: No save due to errors"; $Lang{CfgEdit_Error__must_be_an_integer} = "Erro: \$var precisa ser um inteiro"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Erro: \$var precisa ser um número com valor-real"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Erro: \$var inserida \$k precisa ser um inteiro"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Erro: \$var inserida \$k precisa ser um número com valor-real"; $Lang{CfgEdit_Error__must_be_executable_program} = "Erro: \$var precisa ser um caminho executável válido"; $Lang{CfgEdit_Error__must_be_valid_option} = "Erro: \$var precisa ser uma opção válida"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Copia host \$copyHost não existe; criando nome de host completo \$fullHost. Exclua este hosts se náo for o que você deseja."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User configuração copiada do host \$fromHost para \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User excluido \$p do \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User adicionado \$p para \$conf, marcado para \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User alterado \$p em \$conf para \$valueNew de \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User excluido host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host alterado \$key de \$valueOld para \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User adicionado host \$host: \$value\n"; #end of lang_pt_BR.pm BackupPC-4.4.0/lib/BackupPC/Lang/uk.pm0000444000047500004750000020523313673511776016170 0ustar craigcraig#!/usr/bin/perl # By Serhiy Yakimchuck yakim@yakim.org.ua 02 sept 2012 vor version 3.2.1 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # use utf8; # -------------------------------- $Lang{Start_Archive} = "ЗапуÑтити архівуваннÑ"; $Lang{Stop_Dequeue_Archive} = "Припинити/видалити з черги"; $Lang{Start_Full_Backup} = " Зробити повний архів"; $Lang{Start_Incr_Backup} = "Зробити інкрементальний архів"; $Lang{Stop_Dequeue_Backup} = "Припилити/видалити з черги"; $Lang{Restore} = "Відновити"; $Lang{Type_full} = "повний"; $Lang{Type_incr} = "інкрементальний"; # ----- $Lang{Only_privileged_users_can_view_admin_options} = "Тільки привілейовані кориÑтувачі можуть бачити адмінÑькі налаштуваннÑ."; $Lang{H_Admin_Options} = "BackupPC Сервер: ÐдмінÑькі налаштуваннÑ"; $Lang{Admin_Options} = "ÐдмінÑькі налаштуваннÑ"; $Lang{Admin_Options_Page} = < \${h2("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñервером")}

    Перечитати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера:
    EOF $Lang{Unable_to_connect_to_BackupPC_server} = "Ðеможливо зв'ÑзатиÑÑ Ð· Ñервером BackupPC"; $Lang{Unable_to_connect_to_BackupPC_server_error_message} = < The error was: \$err.
    Perhaps the BackupPC server is not running or there is a configuration error. Please report this to your Sys Admin. EOF $Lang{Admin_Start_Server} = < The BackupPC server at \$Conf{ServerHost} port \$Conf{ServerPort} is not currently running (maybe you just stopped it, or haven't yet started it).
    Do you want to start it? EOF # ----- $Lang{H_BackupPC_Server_Status} = "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñервера BackupPC"; $Lang{BackupPC_Server_Status_General_Info} = <
  • PID Ñервера - \$Info{pid}, на комп'ютері \$Conf{ServerHost}, верÑÑ–Ñ \$Info{Version}, запущений \$serverStartTime.
  • Цей ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±ÑƒÐ² згенерований \$now.
  • ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¾Ñтанній раз була завантажена \$configLoadTime.
  • ÐаÑтупного разу комп\'ютери будуть поÑтавлені до черги \$nextWakeupTime.
  • Інша інформаціÑ:
    • \$numBgQueue запитів в черзі на резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð· чаÑу оÑтаннього запуÑку планувальника,
    • \$numUserQueue запитів в черзі кориÑтувачів на резервне копіюваннÑ,
    • \$numCmdQueue запитів в черзі на Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, \$poolInfo
    • Файлова ÑиÑтема пула зайнÑта на \$Info{DUlastValue}% (\$DUlastTime), ÑьогоднÑшній макÑимум \$Info{DUDailyMax}% (\$DUmaxTime) вчорашній макÑимум \$Info{DUDailyMaxPrev}%.
    • Inode Файлова ÑиÑтема пула зайнÑта на \$Info{DUInodelastValue}% (\$DUlastTime), ÑьогоднÑшній макÑимум \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) вчорашній макÑимум \$Info{DUInodeDailyMaxPrev}%.
    EOF $Lang{BackupPC_Server_Status} = < \${h2("Запущені зараз завданнÑ")}

    \$jobStr
    ХоÑÑ‚ Тип КориÑтувач Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку Команда PID Xfer PID Status Count

    \$generalInfo \${h2("Помилки, що потребують уваги")}

    \$statusStr
    ХоÑÑ‚ Тип КориÑтувач ОÑÑ‚Ð°Ð½Ð½Ñ Ñпроба Деталі Ð§Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ ОÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° (крім відÑутноÑті пінга)
    EOF # -------------------------------- $Lang{BackupPC__Server_Summary} = "BackupPC: Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ хоÑтах"; $Lang{BackupPC__Archive} = "BackupPC: Ðрхів"; $Lang{BackupPC_Summary} = <

    • Цей ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±ÑƒÐ»Ð¾ згенеровано \$now.
    • Файлова ÑиÑтема пула зайнÑта на \$Info{DUlastValue}% (\$DUlastTime), ÑьогоднÑшній макÑимум \$Info{DUDailyMax}% (\$DUmaxTime) вчорашній макÑимум \$Info{DUDailyMaxPrev}%.
    • Inode Файлова ÑиÑтема пула зайнÑта на \$Info{DUInodelastValue}% (\$DUlastTime), ÑьогоднÑшній макÑимум \$Info{DUInodeDailyMax}% (\$DUInodemaxTime) вчорашній макÑимум \$Info{DUInodeDailyMaxPrev}%.

    \${h2("ХоÑти, що мають резервні копії")}

    Загалом \$hostCntGood хоÑтів, що міÑÑ‚Ñть:

    • \$fullTot загальний розмір повних резервних копій \${fullSizeTot}GiB (до об\'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚Ð° ÑтиÑканнÑ),
    • \$incrTot загальний розмір інкрементальних резервних копій \${incrSizeTot}GiB (до об\'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚Ð° ÑтиÑканнÑ).

    \$strGood
    ХоÑÑ‚ КориÑтувач Коментар #Кіль-ть повн. копій Вік повн. копій (дні) Повний розмір (GiB) ШвидкіÑть (MB/s) #Кіль-ть інкр. копій Вік інкр. копій (дні) ОÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¿Ñ–Ñ (days) Стан #Xfer помилки ОÑÑ‚Ð°Ð½Ð½Ñ Ð´Ñ–Ñ
    \${h2("ХоÑти без резервних копій")}

    Загалом \$hostCntNone хоÑтів без резервних копій.

    \$strNone
    ХоÑÑ‚ КориÑтувач Коментар #Кіль-ть повн. копій Вік повн. копій (дні) Повний розмір (GiB) ШвидкіÑть (MB/s) #Кіль-ть інкр. копій Вік інкр. копій (дні) ОÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¿Ñ–Ñ (days) Стан #Xfer помилки ОÑÑ‚Ð°Ð½Ð½Ñ Ð´Ñ–Ñ
    EOF $Lang{BackupPC_Archive} = < Ð’Ñього \$hostCntGood хоÑтів, що мають повну резервну копію загальним розміром \${fullSizeTot}GiB

    \$strGood \$checkAllHosts
    Host КориÑтувач Розмір копії

    EOF $Lang{BackupPC_Archive2} = < \$HostListStr

    \$hiddenStr \$paramStr
    EOF $Lang{BackupPC_Archive2_location} = < МіÑцезнаходженнÑ/ПриÑтрій архіву EOF $Lang{BackupPC_Archive2_compression} = < СтиÑÐºÐ°Ð½Ð½Ñ None
    gzip
    bzip2 EOF $Lang{BackupPC_Archive2_parity} = < ВідÑоток даних парноÑті (0 = disable, 5 = typical) EOF $Lang{BackupPC_Archive2_split} = < Розділити на чаÑтини Megabytes EOF # ----------------------------------- $Lang{Pool_Stat} = <Пул займає \${poolSize}GiB в тому чиÑлі \$info->{"\${name}FileCnt"} файлів та \$info->{"\${name}DirCnt"} тек (на \$poolTime),
  • Під Ñ‡Ð°Ñ Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÑƒÐ»Ñƒ виÑвлено \$info->{"\${name}FileCntRep"} файлів що повторюютьÑÑ Ð· найбільшою кількіÑтю повторень \$info->{"\${name}FileRepMax"},
  • Під Ñ‡Ð°Ñ Ð½Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¾ \$info->{"\${name}FileCntRm"} файлів загальним розміром \${poolRmSize}GiB (близько \$poolTime), EOF # -------------------------------- $Lang{BackupPC__Backup_Requested_on__host} = "BackupPC: Запит на резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð· \$host"; $Lang{BackupPC__Delete_Requested_for_a_backup_of__host} = "BackupPC: Delete Requested for a backup of \$host"; # -------------------------------- $Lang{REPLY_FROM_SERVER} = < Відповідь з Ñервера: \$reply

    ПовернутиÑÑ Ð½Ð° Ñторінку хоÑта \$host . EOF # -------------------------------- $Lang{BackupPC__Start_Backup_Confirm_on__host} = "BackupPC: Start Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_start} = < Резервне \$type ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \$host.

    Ви дійÑно хочете це зробити?
    EOF # -------------------------------- $Lang{BackupPC__Stop_Backup_Confirm_on__host} = "BackupPC: Stop Backup Confirm on \$host"; # -------------------------------- $Lang{Are_you_sure_stop} = < Ви зупинÑєте/видалÑєте з черги резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \$host;
    Also, please don\'t start another backup for hours.

    Ви дійÑно хочете це зробити?

    EOF # -------------------------------- $Lang{Only_privileged_users_can_view_queues_} = "Тільки привілейовані кориÑтувачі можуть переглÑдати черги."; # -------------------------------- $Lang{Only_privileged_users_can_archive} = "Тільки привілейовані кориÑтувачі можуть Ñтворювати резервну копію."; # -------------------------------- $Lang{BackupPC__Queue_Summary} = "BackupPC: Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ чергам завдань"; # -------------------------------- $Lang{Backup_Queue_Summary} = < ÐаÑтупні запити кориÑтувачів поÑтавлені до черги:

    \$strUser
    ХоÑÑ‚ Action Ð§Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ КориÑтувач
    \${h2("Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ фоновій черзі")}

    ÐаÑтупні фонові запити були поÑтавлені до черги:

    \$strBg
    ХоÑÑ‚ Action Ð§Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ КориÑтувач
    \${h2("Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ черзі команд")}

    ÐаÑтупні команди були поÑтавлені до черги:

    \$strCmd
    ХоÑÑ‚ Action Ð§Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ КориÑтувач Команда
    EOF # -------------------------------- $Lang{Backup_PC__Log_File__file} = "BackupPC: Файли \$file"; $Lang{Log_File__file__comment} = < EOF # -------------------------------- $Lang{Contents_of_log_file} = <\$file, було змінено \$mtimeStr \$comment EOF # -------------------------------- $Lang{skipped__skipped_lines} = "[ пропущено \$skipped Ñ€Ñдків ]\n"; # -------------------------------- $Lang{_pre___Can_t_open_log_file__file} = "
    \nÐе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл логу \$file\n";
    
    # --------------------------------
    $Lang{BackupPC__Log_File_History} = "BackupPC: ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð»Ð¾Ð³-файлу";
    $Lang{Log_File_History__hdr}      = <
    
    \$str
    
    Файл Розмір Ð§Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸
    EOF # ------------------------------- $Lang{Recent_Email_Summary} = < \$str
    Отримувач ХоÑÑ‚ Ð§Ð°Ñ Ð¢ÐµÐ¼Ð°
    EOF # ------------------------------ $Lang{Browse_backup__num_for__host} = "BackupPC: ПродивитиÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñƒ копію \$num Ð´Ð»Ñ \$host"; # ------------------------------ $Lang{Restore_Options_for__host} = "BackupPC: ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ \$host"; $Lang{Restore_Options_for__host2} = < You have selected the following files/directories from Ви позначили лаÑтупні файли/теки з реÑурÑу \$share, номер резервної копіїr #\$num:
      \$fileListStr

    У Ð’Ð°Ñ Ñ” три варіанта Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¸Ñ… файлів/тек. Виберіть, будь лаÑка, один з них:

    \${h2("Варіант 1: ПрÑме відновленнÑ")}

    EOF $Lang{Restore_Options_for__host_Option1} = <\$directHost.

    Увага!: Ð’ÑÑ– Ñ–Ñнуючі файли будуть перезапиÑані!

    \$hiddenStr
    Restore the files to host
    Restore the files to share
    Restore the files below dir
    (relative to share)
    EOF $Lang{Restore_Options_for__host_Option1_disabled} = < \${h2("Варіант 2: Звантажити Zip архів")}

    Ви можете звантажити zip-архів, що буде міÑтити вÑÑ– обрані файли/теки. Ви можете викориÑтати локальну програму, наприклад WinZip, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ щоб продивитиÑÑ Ð°Ð±Ð¾ відновити будь-Ñкі файли.

    Увага: в залежноÑті від того, Ñкі файли/теки Ви позначили залежить розмір архіву. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¹Ð¾Ð³Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ зайнÑти деÑкий чаÑ. Ви маєте бути впевнені, що Вам виÑтачить міÑÑ†Ñ Ð½Ð° локальному диÑку Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ збереженнÑ.

    \$hiddenStr Створити архів відноÑно \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (інакше архів буде міÑтити повні шлÑхи).
    Compression (0=off, 1=fast,...,9=best)
    Code page (e.g. cp866)

    EOF # ------------------------------ $Lang{Option_2__Download_Zip_archive2} = < \${h2("Option 2: Download Zip archive")}

    Archive::Zip не вÑтановлено тому Ви не можете звантажити zip-архів. ПопроÑіть ÑиÑтемного адмініÑтратора вÑтановити Archive::Zip з www.cpan.org.

    EOF # ------------------------------ $Lang{Option_3__Download_Zip_archive} = < Ви можете звантажити tar-архів, що буде міÑтити вÑÑ– обрані файли/теки. Ви можете викориÑтати локальну програму, наприклад WinZip або tar, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ щоб продивитиÑÑ Ð°Ð±Ð¾ відновити будь-Ñкі файли.

    Увага: в залежноÑті від того, Ñкі файли/теки Ви позначили залежить розмір архіву. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¹Ð¾Ð³Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° Ð·Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ зайнÑти деÑкий чаÑ. Ви маєте бути впевнені, що Вам виÑтачить міÑÑ†Ñ Ð½Ð° локальному диÑку Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ збереженнÑ.

    \$hiddenStr Створити архів відноÑно \${EscHTML(\$pathHdr eq "" ? "/" : \$pathHdr)} (інакше архів буде міÑтити повні шлÑхи).
    EOF # ------------------------------ $Lang{Restore_Confirm_on__host} = "BackupPC: ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° \$host"; $Lang{Are_you_sure} = < Ви починаєте прÑме Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° комп\'ютер \$In{hostDest}. ÐаÑтупні файли будуть відновлені до реÑурÑу \$In{shareDest}, з архівної копії номер \$num:

    \$fileListStr
    Original file/dirWill be restored to

    \$hiddenStr Ви дійÑно хочете це зробити?
    EOF # -------------------------- $Lang{Restore_Requested_on__hostDest} = "BackupPC: Запит на Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ \$hostDest"; $Lang{Reply_from_server_was___reply} = < Відповідь Ñервера була: \$reply

    ПовернітьÑÑ Ð´Ð¾ \$hostDest home page. EOF $Lang{BackupPC_Archive_Reply_from_server} = < Відповідь Ñервера була: \$reply EOF # -------------------------------- $Lang{BackupPC__Delete_Backup_Confirm__num_of__host} = "BackupPC: Delete Backup Confirm #\$num of \$host"; # -------------------------------- $Lang{A_filled} = "a filled"; $Lang{An_unfilled} = "an unfilled"; $Lang{Are_you_sure_delete} = < You are about to delete \$filled \$type backup #\$num of \$host.

    Do you really want to do this?
    EOF # ------------------------- $Lang{Host__host_Backup_Summary} = "BackupPC: Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ резервному копіюванню хоÑта \$host "; $Lang{Host__host_Backup_Summary2} = < \$warnStr
      \$statusStr

    \${h2("Дії кориÑтувача")}

    \$startIncrStr

    \${h2("Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ резервні копії")}

    ÐатиÑніть на номер резервної копії Ð´Ð»Ñ Ð¾Ð³Ð»Ñду та Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з неї.

    \$deleteHdrStr \$str
    Рез. КопіÑ# тип Повний Рівень Дата початку ТриваліÑть/хв Вік/днів Тримайте Прокоментуйте

    \$restoreStr

    \${h2("Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ помилки Xfer")} \$errStr
    Backup# Тип Журнал #Xfer помилок #паганих файлів #паганих реÑурÑів #tar помилок
    \${h2("Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ файлах")}

    ІÑнуючі файли, це ті, Ñкі вже були в пулі; нові файли це ті, що тільки-но додаютьÑÑ Ð´Ð¾ пулу. ПуÑті файли та SMB-помилки не враховуютьÑÑ

    \$sizeStr
    Totals Existing Files New Files
    Рез. копіÑ# Тип #Файли Розмір/MB MB/Ñ #Файли Розмір/MB #Файли Розмір/MB
    \${h2("Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ ÑтиÑканнÑ")}

    Рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… та Ñ–Ñнуючих файлів.

    \$compStr
    ІÑнуючі файли Ðові файли
    Рез. копіÑ# Тип Рівень ÑтиÑк. Розмір/MB СтиÑк./MB СтиÑк Розмір/MB СтиÑк/MB СтиÑк
    EOF $Lang{Host__host_Archive_Summary} = "BackupPC: Host \$host Archive Summary"; $Lang{Host__host_Archive_Summary2} = < \$warnStr
      \$statusStr
    \${h2("Дії кориÑтувачів")}

    \$ArchiveStr EOF # ------------------------- $Lang{Error} = "BackupPC: Помилки"; $Lang{Error____head} = <\$mesg

    EOF # ------------------------- $Lang{NavSectionTitle_} = "Сервер"; # ------------------------- $Lang{Backup_browse_for__host} = <
    • You are browsing backup #\$num, which started around \$backupTime (\$backupAge days ago), \$filledBackup
    • Увійти в текуy:
    • Прокоментуйте:
    • ÐатиÑніть на теку нижче Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ в неї,
    • ÐатиÑніть на файл нижче Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ відновленнÑ,
    • Ви можете переглÑнути резервну копію history of the current directory. \$share2pathStr
    \${h2("Contents of \$dirDisplay")}

    \$dirStr

    \$fileHeader \$topCheckAll \$fileStr \$checkAll

    EOF $Lang{Browse_ClientShareName2Path} = < Mapping of share name to real client path (ClientShareName2Path):
      \$share2pathStr
    EOF # ------------------------------ $Lang{DirHistory_backup_for__host} = "BackupPC: ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… копій тек Ð´Ð»Ñ \$host"; # # These two strings are used to build the links for directories and # file versions. Files are appended with a version number. # $Lang{DirHistory_dirLink} = "dir"; $Lang{DirHistory_fileLink} = "v"; $Lang{DirHistory_for__host} = < Тут відображені вÑÑ– унікальні верÑÑ–Ñ— файлів в уÑÑ–Ñ… Резервних копіÑÑ…:
    • ÐатиÑніть на номер резервної копії Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ переглÑду рез. копій,
    • ÐатиÑніть на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° теку (\$Lang->{DirHistory_dirLink}) Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ñƒ в цю теку,
    • ÐатиÑніть на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° верÑÑ–ÑŽ файла (\$Lang->{DirHistory_fileLink}0, \$Lang->{DirHistory_fileLink}1, ...) Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ звантаженнÑe,
    • Фали з однаковим вміÑтом мають однакову верÑÑ–ÑŽ в уÑÑ–Ñ… резервних копіÑÑ… (PleaseTranslateThis: except between v3 and v4 backups),
    • Файли та теки, що відÑутні в поточній резервній копії позначені порожнім прÑмокутником.
    • Файли однієї верÑÑ–Ñ— можуть відрізнÑтиÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð°Ð¼Ð¸ файлової ÑиÑтеми. Виберіть номмер резервної копії Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду атрибутів.
    \${h2("ІÑÑ‚Ð¾Ñ€Ñ–Ñ \$dirDisplay")}
    \$backupNumStr\$backupTimeStr \$fileStr
    Backup number
    Backup time
    EOF # ------------------------------ $Lang{Restore___num_details_for__host} = "BackupPC: Подробиці Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ #\$num Ð´Ð»Ñ \$host"; $Lang{Restore___num_details_for__host2} = <
    Ðомер \$Restores[\$i]{num}
    Запит від \$RestoreReq{user}
    Ð§Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ \$reqTime
    Результат \$Restores[\$i]{result}
    ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилки \$Restores[\$i]{errorMsg}
    ХоÑÑ‚ джерело \$RestoreReq{hostSrc}
    Ðомер вихідн. рез. копії \$RestoreReq{num}
    Вихідний реÑÑƒÑ€Ñ \$RestoreReq{shareSrc}
    ХоÑÑ‚ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \$RestoreReq{hostDest}
    РеÑÑƒÑ€Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \$RestoreReq{shareDest}
    Ð§Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ \$startTime
    ТриваліÑть \$duration min
    Кільк. файлів \$Restores[\$i]{nFiles}
    Загальний розмір \${MB} MB
    ШвидкіÑть передачі \$MBperSec MB/sec
    TarCreate помилки \$Restores[\$i]{tarCreateErrs}
    Xfer помилки \$Restores[\$i]{xferErrs}
    Xfer log file View, Errors

    \${h1("Файл/СпиÑок тек")}

    \$fileListStr
    Original file/dirRestored to
    EOF # ------------------------------ $Lang{Archive___num_details_for__host} = "BackupPC: Деталі архіву #\$num Ð´Ð»Ñ \$host"; $Lang{Archive___num_details_for__host2} = <
    Ðомер \$Archives[\$i]{num}
    Запит від \$ArchiveReq{user}
    Ð§Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ \$reqTime
    Результат \$Archives[\$i]{result}
    Помилки \$Archives[\$i]{errorMsg}
    Ð§Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ \$startTime
    ТриваліÑть \$duration min
    Xfer log файл View, Errors

    \${h1("Host list")}

    \$HostListStr
    ХоÑÑ‚Ðомер резерв. копії
    EOF # ----------------------------------- $Lang{Email_Summary} = "BackupPC: Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ Email"; # ----------------------------------- # !! ERROR messages !! # ----------------------------------- $Lang{BackupPC__Lib__new_failed__check_apache_error_log} = "BackupPC::Lib->new failed: check apache error_log\n"; $Lang{Wrong_user__my_userid_is___} = "Ðеправильний кориÑтувач: мій userid \$>, а не \$uid(\$Conf{BackupPCUser})\n"; # $Lang{Only_privileged_users_can_view_PC_summaries} = "Only privileged users can view PC summaries."; $Lang{Only_privileged_users_can_stop_or_start_backups} = "Тільки привілейований кориÑтувач може запуÑтити резевне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \${EscHTML(\$host)}."; $Lang{Invalid_number__num} = "Ðеправильнмй номер \${EscHTML(\$In{num})}"; $Lang{Unable_to_open__file__configuration_problem} = "Ðеможливо відкрити \$file: проблеми з конфігурацією?"; $Lang{Only_privileged_users_can_view_log_or_config_files} = "Тільки привілейований кориÑтувач може переглÑдати log чи файл конфігурації."; $Lang{Only_privileged_users_can_view_log_files} = "Тільки привілейований кориÑтувач може переглÑдати log файли."; $Lang{Only_privileged_users_can_view_email_summaries} = "Тільки привілейований кориÑтувач може переглÑдати інформацію про email."; $Lang{Only_privileged_users_can_browse_backup_files} = "Тільки привілейований кориÑтувач може переглÑдати файли резервних копій Ð´Ð»Ñ Ñ…Ð¾Ñту \${EscHTML(\$In{host})}."; $Lang{Only_privileged_users_can_delete_backups} = "Only privileged users can delete backups of host \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Порожнє ім\'Ñ Ñ…Ð¾Ñта."; $Lang{Directory___EscHTML} = "Тека \${EscHTML(\"\$TopDir/pc/\$host/\$num\")} порожнÑ"; $Lang{Can_t_browse_bad_directory_name2} = "Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ неправильну назву теки \${EscHTML(\$relDir)}"; $Lang{Only_privileged_users_can_restore_backup_files} = "Тільки привілейований кориÑтувач може відновлювати файли з резервних копій Ð´Ð»Ñ Ñ…Ð¾Ñта \${EscHTML(\$In{host})}."; $Lang{Bad_host_name} = "Ðеправильне ім\'Ñ Ñ…Ð¾Ñта \${EscHTML(\$host)}"; $Lang{You_haven_t_selected_any_files__please_go_Back_to} = "Ви не обрали жодного файла; Будь лаÑка повернітьÑÑ Ð½Ð°Ð·Ð°Ð´ та оберіть ÑкийÑÑŒ файл."; $Lang{You_haven_t_selected_any_hosts} = "Ви не обрали жодного хоÑта; будь лаÑка повернітьÑÑ Ð½Ð°Ð·Ð°Ð´ та оберіть ÑкийÑÑŒ хоÑÑ‚."; $Lang{Nice_try__but_you_can_t_put} = "Добра Ñпроба, але ви не можете вÑтавити \'..\' у будь Ñке ім\'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"; $Lang{Host__doesn_t_exist} = "ХоÑÑ‚ \${EscHTML(\$In{hostDest})} не Ñ–Ñнує"; $Lang{You_don_t_have_permission_to_restore_onto_host} = "У Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° хоÑÑ‚ \${EscHTML(\$In{hostDest})}"; $Lang{Can_t_open_create__openPath} = "не можливо відкрити/Ñтворити \${EscHTML(\"\$openPath\")}"; $Lang{Only_privileged_users_can_restore_backup_files2} = "Тільки привілейований кориÑтувач може відновити резервну копію Ð´Ð»Ñ Ñ…Ð¾Ñта \${EscHTML(\$host)}."; $Lang{Empty_host_name} = "Порожнє ім\'Ñ Ñ…Ð¾Ñта"; $Lang{Unknown_host_or_user} = "Ðевідомий хоÑÑ‚ або кориÑтувач \${EscHTML(\$host)}"; $Lang{Only_privileged_users_can_view_information_about} = "Тільки привілейований кориÑтувач може переглÑдати інформацію про хоÑÑ‚ \${EscHTML(\$host)}."; $Lang{Only_privileged_users_can_view_archive_information} = "Тільки привілейований кориÑтувач може переглÑдати інформацію про архівуваннÑ."; $Lang{Only_privileged_users_can_view_restore_information} = "Тільки привілейований кориÑтувач може переглÑдати інформацію про відновленнÑ."; $Lang{Restore_number__num_for_host__does_not_exist} = "Ðомер Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ \$num Ð´Ð»Ñ Ñ…Ð¾Ñту \${EscHTML(\$host)} не Ñ–Ñнує."; $Lang{Archive_number__num_for_host__does_not_exist} = "Ðомер архіву \$num Ð´Ð»Ñ Ñ…Ð¾Ñту \${EscHTML(\$host)} не Ñ–Ñнує."; $Lang{Can_t_find_IP_address_for} = "Ðеможливо знайти IP адреÑу Ð´Ð»Ñ \${EscHTML(\$host)}"; $Lang{host_is_a_DHCP_host} = < ÐаÑкільки Ñ Ð±Ð°Ñ‡Ñƒ \$host має приватну DHCP адреÑу, Ви маєте можливіÑть запуÑтити запит з клієнтÑького комп\'ютера ÑамоÑтійно. EOF # ------------------------------------ # !! Server Mesg !! # ------------------------------------ $Lang{Backup_requested_on_DHCP__host} = "Запит на резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° DHCP \$host (\$In{hostIP}) від \$User з \$ENV{REMOTE_ADDR}"; $Lang{Backup_requested_on__host_by__User} = "Запит на резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð· \$host від \$User"; $Lang{Backup_stopped_dequeued_on__host_by__User} = "Резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð¾/виключено з черги на \$host від \$User"; $Lang{Restore_requested_to_host__hostDest__backup___num} = "Запит на Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° \$hostDest, резерв. ÐºÐ¾Ð¿Ñ–Ñ #\$num, від \$User на \$ENV{REMOTE_ADDR}"; $Lang{Delete_requested_for_backup_of__host_by__User} = "Delete requested for backup #\$num of \$host by \$User from \$ENV{REMOTE_ADDR}"; $Lang{Archive_requested} = "Запит на архів від \$User на \$ENV{REMOTE_ADDR}"; # ------------------------------------------------- # ------- Stuff that was forgotten ---------------- # ------------------------------------------------- $Lang{Status} = "СтатуÑ"; $Lang{PC_Summary} = "Зведена Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ хоÑтам"; $Lang{LOG_file} = "LOG файл"; $Lang{LOG_files} = "LOG файли"; $Lang{Old_LOGs} = "Старі LOGи"; $Lang{Email_summary} = "Поштові налаштуваннÑ"; $Lang{Config_file} = "Файл конфігурації"; # $Lang{Hosts_file} = "Hosts file"; $Lang{Current_queues} = "Поточні черги"; $Lang{Documentation} = "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ (англ)"; #$Lang{Host_or_User_name} = "Host or User name:"; $Lang{Go} = "Перейти"; $Lang{Hosts} = "ХоÑти"; $Lang{Select_a_host} = "Виберіть хоÑÑ‚..."; $Lang{There_have_been_no_archives} = "

    Ðемає жодної резервної копії

    \n"; $Lang{This_PC_has_never_been_backed_up} = "

    З цього PC ніколи не ÑтворювалаÑÑŒ резервна копіÑ!!

    \n"; $Lang{This_PC_is_used_by} = "
  • Цей PC викориÑтовуєтьÑÑ \${UserLink(\$user)}"; $Lang{Extracting_only_Errors} = "(Показати лише помилки)"; $Lang{XferLOG} = "XferLOG"; $Lang{Errors} = "Помилки"; # ------------ $Lang{Last_email_sent_to__was_at___subject} = <ОÑтанній email було відіÑлано доo \${UserLink(\$user)} Ñ‡Ð°Ñ \$mailTime, тема "\$subj". EOF # ------------ $Lang{The_command_cmd_is_currently_running_for_started} = <Команда \$cmd зараз виконуєтьÑÑ Ð´Ð»Ñ Ñ…Ð¾Ñта \$host, started \$startTime. EOF # ----------- $Lang{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon} = <ХоÑÑ‚ \$host поÑтавлений у фонову чергу (повернетьÑÑ Ð·Ð° першої можливоÑті). EOF # ---------- $Lang{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon} = <ХоÑÑ‚ \$host поÑтавлений у чергу кориÑтувача (повернетьÑÑ Ð·Ð° першої можливоÑті). EOF # --------- $Lang{A_command_for_host_is_on_the_command_queue_will_run_soon} = <Команда Ð´Ð»Ñ \$host поÑтавлена в чергу команд (Ñкоро буде запущена). EOF # -------- $Lang{Last_status_is_state_StatusHost_state_reason_as_of_startTime} = <Last status is state \"\$Lang->{\$StatusHost{state}}\"\$reason as of \$startTime. EOF # -------- $Lang{Last_error_is____EscHTML_StatusHost_error} = <ОÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° \"\${EscHTML(\$StatusHost{error})}\". EOF # ------ $Lang{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times} = <Ping до \$host не пройшов \$StatusHost{deadCnt} декілька разів підрÑд. EOF # ----- $Lang{Prior_to_that__pings} = "До цього, pings"; # ----- $Lang{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times} = <\$priorStr to \$host have succeeded \$StatusHost{aliveCnt} consecutive times. EOF $Lang{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___} = <Because \$host has been on the network at least \$Conf{BlackoutGoodCnt} consecutive times, it will not be backed up from \$blackoutStr. EOF $Lang{__time0_to__time1_on__days} = "\$t0 to \$t1 on \$days"; $Lang{Backups_are_deferred_for_hours_hours_change_this_number} = <Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ÐºÐ»Ð°Ð´ÐµÐ½Ðµ на \$hours годин (change this number). EOF $Lang{tryIP} = " and \$StatusHost{dhcpHostIP}"; # $Lang{Host_Inhost} = "Host \$In{host}"; $Lang{checkAll} = <  Select all EOF $Lang{checkAllHosts} = <  Select all EOF $Lang{fileHeader} = < Name Тип Режим # Розмір Дата зміни EOF $Lang{Home} = "Додому"; $Lang{Browse} = "ПродивитиÑÑ Ñ€ÐµÐ·ÐµÑ€Ð². копії"; $Lang{Last_bad_XferLOG} = "Last bad XferLOG"; $Lang{Last_bad_XferLOG_errors_only} = "Last bad XferLOG (errors only)"; $Lang{This_display_is_merged_with_backup} = < This display is merged with backup #\$numF. EOF $Lang{Visit_this_directory_in_backup} = < Оберіть резервну копію, Ñку Ви хочете продивитиÑÑ: EOF $Lang{Restore_Summary} = < ÐатиÑніть на номер Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду деталей. \$restoreStr
    ВідновленнÑ# Результат Дата початку Тривал/хи #файлів MB #tar помилок #xfer помилок

    EOF $Lang{Archive_Summary} = < ÐатиÑніть на номер архіву Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду деталей. \$ArchiveStr
    Ðрхів# Результат Дата початку Трив/хв

    EOF $Lang{BackupPC__Documentation} = "BackupPC: ДокументаціÑ"; $Lang{No} = "ні"; $Lang{Yes} = "так"; $Lang{The_directory_is_empty} = <The directory \$dirDisplay is empty EOF #$Lang{on} = "on"; $Lang{off} = "off"; $Lang{backupType_full} = "повний"; $Lang{backupType_incr} = "інкрементальний"; $Lang{backupType_active} = "active"; $Lang{backupType_partial} = "чаÑтковий"; $Lang{failed} = "неуÑпішно"; $Lang{success} = "уÑпішно"; $Lang{and} = "та"; # ------ # Hosts states and reasons $Lang{Status_idle} = "бездіÑ"; $Lang{Status_backup_starting} = "Резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾"; $Lang{Status_backup_in_progress} = "Резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð² процеÑÑ–"; $Lang{Status_restore_starting} = "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾"; $Lang{Status_restore_in_progress} = "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² процеÑÑ–"; $Lang{Status_admin_pending} = "link pending"; $Lang{Status_admin_running} = "link running"; $Lang{Reason_backup_done} = "зроблено"; $Lang{Reason_restore_done} = "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ð¾"; $Lang{Reason_archive_done} = "Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ð¾"; $Lang{Reason_nothing_to_do} = "бездіÑ"; $Lang{Reason_backup_failed} = "резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½ÐµÑƒÑпішне"; $Lang{Reason_restore_failed} = "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÑƒÑпішне"; $Lang{Reason_archive_failed} = "Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÑƒÑпішне"; $Lang{Reason_no_ping} = "no ping"; $Lang{Reason_backup_canceled_by_user} = "резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ðµ кориÑтувачем"; $Lang{Reason_restore_canceled_by_user} = "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ðµ кориÑтувачем"; $Lang{Reason_archive_canceled_by_user} = "Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ðµ кориÑтувачем"; $Lang{Disabled_OnlyManualBackups} = "auto відключене"; $Lang{Disabled_AllBackupsDisabled} = "відключене"; # --------- # Email messages # No backup ever $Lang{EMailNoBackupEverSubj} = "BackupPC: жлдного резерв. ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \$host не було уÑпішним"; $Lang{EMailNoBackupEverMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has never been successfully backed up by our PC backup software. PC backups should occur automatically when your PC is connected to the network. You should contact computer support if: - Your PC has been regularly connected to the network, meaning there is some configuration or setup problem preventing backups from occurring. - You don't want your PC backed up and you want these email messages to stop. Otherwise, please make sure your PC is connected to the network next time you are in the office. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # No recent backup $Lang{EMailNoBackupRecentSubj} = "BackupPC: no recent backups on \$host"; $Lang{EMailNoBackupRecentMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, Your PC ($host) has not been successfully backed up for $days days. Your PC has been correctly backed up $numBackups times from $firstTime to $days days ago. PC backups should occur automatically when your PC is connected to the network. If your PC has been connected for more than a few hours to the network during the last $days days you should contact IS to find out why backups are not working. Otherwise, if you are out of the office, there's not much you can do, other than manually copying especially critical files to other media. You should be aware that any files you have created or changed in the last $days days (including all new email and attachments) cannot be restored if your PC disk crashes. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF # Old Outlook files $Lang{EMailOutlookBackupSubj} = "BackupPC: Outlook files on \$host need to be backed up"; $Lang{EMailOutlookBackupMesg} = <<'EOF'; To: $user$domain cc: Subject: $subj $headers Dear $userName, The Outlook files on your PC have $howLong. These files contain all your email, attachments, contact and calendar information. Your PC has been correctly backed up $numBackups times from $firstTime to $lastTime days ago. However, Outlook locks all its files when it is running, preventing these files from being backed up. It is recommended you backup the Outlook files when you are connected to the network by exiting Outlook and all other applications, and, using just your browser, go to this link: $CgiURL?host=$host Select "Start Incr Backup" twice to start a new incremental backup. You can select "Return to $host page" and then hit "reload" to check the status of the backup. It should take just a few minutes to complete. Regards, BackupPC Genie https://backuppc.github.io/backuppc EOF $Lang{howLong_not_been_backed_up} = "not been backed up successfully"; $Lang{howLong_not_been_backed_up_for_days_days} = "not been backed up for \$days days"; ####################################################################### # RSS strings ####################################################################### $Lang{RSS_Doc_Title} = "BackupPC Server"; $Lang{RSS_Doc_Description} = "RSS feed for BackupPC"; $Lang{RSS_Host_Summary} = < Note: Check Override if you want to modify a value specific to this host.

    EOF $Lang{CfgEdit_Button_Save} = "Зберегти"; $Lang{CfgEdit_Button_Insert} = "Ð’Ñтавити"; $Lang{CfgEdit_Button_Delete} = "Видалити"; $Lang{CfgEdit_Button_Add} = "Додати"; $Lang{CfgEdit_Button_Override} = "ПерезапиÑати"; $Lang{CfgEdit_Button_New_Key} = "Ðове значеннÑ"; $Lang{CfgEdit_Button_New_Share} = "New ShareName or '*'"; $Lang{CfgEdit_Error_No_Save} = "Error: No save due to errors"; $Lang{CfgEdit_Error__must_be_an_integer} = "Error: \$var must be an integer"; $Lang{CfgEdit_Error__must_be_real_valued_number} = "Error: \$var must be a real-valued number"; $Lang{CfgEdit_Error__entry__must_be_an_integer} = "Error: \$var entry \$k must be an integer"; $Lang{CfgEdit_Error__entry__must_be_real_valued_number} = "Error: \$var entry \$k must be a real-valued number"; $Lang{CfgEdit_Error__must_be_executable_program} = "Error: \$var must be a valid executable path"; $Lang{CfgEdit_Error__must_be_valid_option} = "Error: \$var must be a valid option"; $Lang{CfgEdit_Error_Copy_host_does_not_exist} = "Copy host \$copyHost doesn't exist; creating full host name \$fullHost. Delete this host if that is not what you wanted."; $Lang{CfgEdit_Log_Copy_host_config} = "\$User copied config from host \$fromHost to \$host\n"; $Lang{CfgEdit_Log_Delete_param} = "\$User deleted \$p from \$conf\n"; $Lang{CfgEdit_Log_Add_param_value} = "\$User added \$p to \$conf, set to \$value\n"; $Lang{CfgEdit_Log_Change_param_value} = "\$User changed \$p in \$conf to \$valueNew from \$valueOld\n"; $Lang{CfgEdit_Log_Host_Delete} = "\$User deleted host \$host\n"; $Lang{CfgEdit_Log_Host_Change} = "\$User host \$host changed \$key from \$valueOld to \$valueNew\n"; $Lang{CfgEdit_Log_Host_Add} = "\$User added host \$host: \$value\n"; #end of lang_en.pm BackupPC-4.4.0/lib/BackupPC/Xfer.pm0000444000047500004750000001160213673511776015567 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Xfer package # # DESCRIPTION # # This library defines a Factory for invoking transfer protocols in # a polymorphic manner. This library allows for easier expansion of # supported protocols. # # AUTHOR # Paul Mantz # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Xfer; use strict; use Encode qw/from_to encode/; use BackupPC::Xfer::Archive; use BackupPC::Xfer::Ftp; use BackupPC::Xfer::Protocol; use BackupPC::Xfer::Rsync; use BackupPC::Xfer::Smb; use BackupPC::Xfer::Tar; use vars qw( $errStr ); sub create { my($protocol, $bpc, $args) = @_; my $xfer; $errStr = undef; if ( $protocol eq 'archive' ) { $xfer = BackupPC::Xfer::Archive->new($bpc, $args); $errStr = BackupPC::Xfer::Archive::errStr() if ( !defined($xfer) ); return $xfer; } elsif ( $protocol eq 'ftp' ) { $xfer = BackupPC::Xfer::Ftp->new($bpc, $args); $errStr = BackupPC::Xfer::Ftp::errStr() if ( !defined($xfer) ); return $xfer; } elsif ( $protocol eq 'rsync' || $protocol eq 'rsyncd' ) { $xfer = BackupPC::Xfer::Rsync->new($bpc, $args); $errStr = BackupPC::Xfer::Rsync::errStr() if ( !defined($xfer) ); return $xfer; } elsif ( $protocol eq 'smb' ) { $xfer = BackupPC::Xfer::Smb->new($bpc, $args); $errStr = BackupPC::Xfer::Smb::errStr() if ( !defined($xfer) ); return $xfer; } elsif ( $protocol eq 'tar' ) { $xfer = BackupPC::Xfer::Tar->new($bpc, $args); $errStr = BackupPC::Xfer::Tar::errStr() if ( !defined($xfer) ); return $xfer; } elsif ( $protocol eq 'protocol' ) { $xfer = BackupPC::Xfer::Protocol->new($bpc, $args); $errStr = BackupPC::Xfer::Protocol::errStr() if ( !defined($xfer) ); return $xfer; } else { $xfer = undef; $errStr = "$protocol is not a supported protocol."; return $xfer; } } # # getShareNames() loads the correct shares dependent on the # transfer type. # sub getShareNames { my($conf) = @_; my $ShareNames; if ( $conf->{XferMethod} eq "tar" ) { $ShareNames = $conf->{TarShareName}; } elsif ( $conf->{XferMethod} eq "ftp" ) { $ShareNames = $conf->{FtpShareName}; } elsif ( $conf->{XferMethod} eq "rsync" || $conf->{XferMethod} eq "rsyncd" ) { $ShareNames = $conf->{RsyncShareName}; } elsif ( $conf->{XferMethod} eq "smb" ) { $ShareNames = $conf->{SmbShareName}; } else { # # default to smb shares # $ShareNames = $conf->{SmbShareName}; } $ShareNames = [$ShareNames] unless ref($ShareNames) eq "ARRAY"; return $ShareNames; } sub getRestoreCmd { my($conf) = @_; my $restoreCmd; if ( $conf->{XferMethod} eq "archive" ) { $restoreCmd = undef; } elsif ( $conf->{XferMethod} eq "ftp" ) { $restoreCmd = undef; } elsif ( $conf->{XferMethod} eq "rsync" || $conf->{XferMethod} eq "rsyncd" ) { $restoreCmd = $conf->{RsyncRestoreArgs}; } elsif ( $conf->{XferMethod} eq "tar" ) { $restoreCmd = $conf->{TarClientRestoreCmd}; } elsif ( $conf->{XferMethod} eq "smb" ) { $restoreCmd = $conf->{SmbClientRestoreCmd}; } else { # # protocol unrecognized # $restoreCmd = undef; } return $restoreCmd; } sub restoreEnabled { my($conf) = @_; my $restoreCmd; if ( $conf->{XferMethod} eq "archive" ) { return; } elsif ( $conf->{XferMethod} eq "ftp" ) { return; } elsif ( $conf->{XferMethod} eq "rsync" || $conf->{XferMethod} eq "rsyncd" || $conf->{XferMethod} eq "tar" || $conf->{XferMethod} eq "smb" ) { $restoreCmd = getRestoreCmd($conf); return !!( ref $restoreCmd eq "ARRAY" ? @$restoreCmd : $restoreCmd ne "" ); } else { return; } } sub errStr { return $errStr; } 1; BackupPC-4.4.0/lib/BackupPC/DirOps.pm0000444000047500004750000003313413673511776016067 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::DirOps package # # DESCRIPTION # # This library defines a BackupPC::DirOps class and a variety of # directory utility functions used by BackupPC. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::DirOps; use strict; use Fcntl ':mode'; use Cwd; use Encode qw/from_to encode_utf8/; use Data::Dumper; use File::Path; use BackupPC::XS; use BackupPC::Storage; use vars qw( $IODirentOk $IODirentLoaded ); use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); require Exporter; require DynaLoader; @ISA = qw(Exporter DynaLoader); @EXPORT_OK = qw( BPC_DT_UNKNOWN BPC_DT_FIFO BPC_DT_CHR BPC_DT_DIR BPC_DT_BLK BPC_DT_REG BPC_DT_LNK BPC_DT_SOCK ); @EXPORT = qw( ); %EXPORT_TAGS = ('BPC_DT_ALL' => [@EXPORT, @EXPORT_OK]); BEGIN { eval "use IO::Dirent qw( readdirent );"; $IODirentLoaded = 1 if ( !$@ ); } # # The need to match the constants in IO::Dirent # use constant BPC_DT_UNKNOWN => 0; use constant BPC_DT_FIFO => 1; ## named pipe (fifo) use constant BPC_DT_CHR => 2; ## character special use constant BPC_DT_DIR => 4; ## directory use constant BPC_DT_BLK => 6; ## block special use constant BPC_DT_REG => 8; ## regular use constant BPC_DT_LNK => 10; ## symbolic link use constant BPC_DT_SOCK => 12; ## socket # # Read a directory and return the entries in sorted inode order. # This relies on the IO::Dirent module being installed. If not, # the inode data is empty and the default directory order is # returned. # # The returned data is a list of hashes with entries {name, type, inode, nlink}. # The returned data includes "." and "..". # # $need is a hash of file attributes we need: type, inode, or nlink. # If set, these parameters are added to the returned hash. # # To support browsing pre-3.0.0 backups where the charset encoding # is typically iso-8859-1, the charsetLegacy option can be set in # $need to convert the path from utf8 and convert the names to utf8. # # If IO::Dirent is successful if will get type and inode for free. # Otherwise, a stat is done on each file, which is more expensive. # sub dirRead { my($bpc, $path, $need) = @_; my(@entries, $addInode); from_to($path, "utf8", $need->{charsetLegacy}) if ( $need->{charsetLegacy} ne "" ); return [] if ( !opendir(my $fh, $path) ); if ( $IODirentLoaded && !$IODirentOk ) { # # Make sure the IO::Dirent really works - some installs # on certain file systems (eg: XFS) don't return a valid type. # and some fail to return valid inode numbers. # # Also create a temporary file to make sure the inode matches. # my $tempTestFile = ".TestFileDirent.$$"; my $fullTempTestFile = $bpc->{TopDir} . "/$tempTestFile"; if ( open(my $fh, ">", $fullTempTestFile) ) { close($fh); } if ( opendir(my $fh, $bpc->{TopDir}) ) { foreach my $e ( readdirent($fh) ) { if ( $e->{name} eq "." && $e->{type} == BPC_DT_DIR && $e->{inode} == (stat($bpc->{TopDir}))[1] ) { $IODirentOk |= 0x1; } if ( $e->{name} eq $tempTestFile && $e->{type} == BPC_DT_REG && $e->{inode} == (stat($fullTempTestFile))[1] ) { $IODirentOk |= 0x2; } } closedir($fh); } unlink($fullTempTestFile) if ( -f $fullTempTestFile ); # # if it isn't ok then don't check again. # if ( $IODirentOk != 0x3 ) { $IODirentLoaded = 0; $IODirentOk = 0; } } if ( $IODirentOk ) { @entries = sort({ $a->{inode} <=> $b->{inode} } readdirent($fh)); map { $_->{type} = 0 + $_->{type} } @entries; # make type numeric } else { @entries = map { {name => $_} } readdir($fh); } closedir($fh); if ( defined($need) && %$need > 0 ) { for ( my $i = 0 ; $i < @entries ; $i++ ) { next if ( (!$need->{inode} || defined($entries[$i]{inode})) && (!$need->{type} || defined($entries[$i]{type})) && (!$need->{nlink} || defined($entries[$i]{nlink})) ); my @s = stat("$path/$entries[$i]{name}"); $entries[$i]{nlink} = $s[3] if ( $need->{nlink} ); if ( $need->{inode} && !defined($entries[$i]{inode}) ) { $addInode = 1; $entries[$i]{inode} = $s[1]; } if ( $need->{type} && !defined($entries[$i]{type}) ) { my $mode = S_IFMT($s[2]); $entries[$i]{type} = BPC_DT_FIFO if ( S_ISFIFO($mode) ); $entries[$i]{type} = BPC_DT_CHR if ( S_ISCHR($mode) ); $entries[$i]{type} = BPC_DT_DIR if ( S_ISDIR($mode) ); $entries[$i]{type} = BPC_DT_BLK if ( S_ISBLK($mode) ); $entries[$i]{type} = BPC_DT_REG if ( S_ISREG($mode) ); $entries[$i]{type} = BPC_DT_LNK if ( S_ISLNK($mode) ); $entries[$i]{type} = BPC_DT_SOCK if ( S_ISSOCK($mode) ); } } } # # Sort the entries if inodes were added (the IO::Dirent case already # sorted above) # @entries = sort({ $a->{inode} <=> $b->{inode} } @entries) if ( $addInode ); # # for browing pre-3.0.0 backups, map iso-8859-1 to utf8 if requested # if ( $need->{charsetLegacy} ne "" ) { for ( my $i = 0 ; $i < @entries ; $i++ ) { from_to($entries[$i]{name}, $need->{charsetLegacy}, "utf8"); } } return \@entries; } # # Same as dirRead, but only returns the names (which will be sorted in # inode order if IO::Dirent is installed) # sub dirReadNames { my($bpc, $path, $need) = @_; my $entries = BackupPC::DirOps::dirRead($bpc, $path, $need); return if ( !defined($entries) ); my @names = map { $_->{name} } @$entries; return \@names; } # # Check if a directory contains an attrib file. # Returns the attrib file name, or undef if none present. # sub dirContainsAttrib { my($bpc, $dir) = @_; my $entries = BackupPC::DirOps::dirRead($bpc, $dir); foreach my $e ( @$entries ) { return $e->{name} if ( $e->{name} =~ /^attrib/ ); } } sub find { my($bpc, $param, $dir, $dontDoCwd) = @_; my $entries = BackupPC::DirOps::dirRead($bpc, $dir, {inode => 1, type => 1}); foreach my $f ( @$entries ) { next if ( $f->{name} eq ".." || $f->{name} eq "." && $dontDoCwd ); $param->{wanted}($f->{name}, "$dir/$f->{name}"); next if ( $f->{type} != BPC_DT_DIR || $f->{name} eq "." ); BackupPC::DirOps::find($bpc, $param, "$dir/$f->{name}", 1); } } # # Stripped down from File::Path. In particular we don't print # many warnings and we try three times to delete each directory # and file -- for some reason the original File::Path rmtree # didn't always completely remove a directory tree on a NetApp. # # This routine updates the reference counts every time it # encounters an attrib file (unless $compress < 0), assuming # $deltaInfo is passed as a BackupPC::XS::DeltaRefCnt::new() # object. # # The $compress argument has three values: # >0 compression is on; reference counts will be updated # for every attrib file encountered # 0 compression is off; reference counts will be updated # for every attrib file encountered # -1 no reference count updating, except for attrib files # <-1 no reference count updating # # This function restores the original cwd after running. # # progressCB is an optional callback that is called once per attrib # file with an argument giving the count of files that have been deleted # (ie: the count of files in attrib, not actual disk-based files). # sub RmTreeQuiet { my($bpc, $roots, $compress, $deltaInfo, $attrCache, $progressCB) = @_; my($cwd) = Cwd::fastcwd(); $cwd = $1 if ( $cwd =~ /(.*)/ ); my $ret = BackupPC::DirOps::RmTreeQuietInner($bpc, $cwd, $roots, $compress, $deltaInfo, $attrCache, $progressCB); chdir($cwd) if ( $cwd ); return $ret; } sub RmTreeQuietInner { my($bpc, $cwd, $roots, $compress, $deltaInfo, $attrCache, $progressCB) = @_; my(@files, $root); if ( defined($roots) && length($roots) ) { $roots = [$roots] unless ref $roots; } else { print(STDERR "RmTreeQuietInner: No root path(s) specified\n"); return 1; } foreach $root ( @$roots ) { my($path, $name); $root =~ s{/+$}{}; if ( $root =~ m{(.*)/(.*)} ) { $path = $1; $name = $2; if ( !-d $path ) { print(STDERR "RmTreeQuietInner: $cwd/$path isn't a directory (while removing $root)\n"); return 1; } if ( !chdir($path) ) { print(STDERR "RmTreeQuietInner: can't chdir to $cwd/$path (while removing $root)\n"); return 1; } } else { $path = "."; $name = $root; } # # If this is an attrib file then we need to open it to # update the reference counts if the caller wants us to # if ( $compress >= -1 && $name =~ /^attrib/ && -f $name ) { if ( $deltaInfo ) { my $attr = BackupPC::XS::Attrib::new($compress); if ( !$attr->read(".", $name) ) { print(STDERR "Can't read attribute file in $cwd/$path/$name\n"); } my $fileCnt = 0; my $d = $attr->digest(); $deltaInfo->update($compress, $d, -1) if ( $deltaInfo && length($d) ); if ( $compress >= 0 ) { my $idx = 0; my $a; while ( 1 ) { ($a, $idx) = $attr->iterate($idx); last if ( !defined($a) ); $fileCnt++; $deltaInfo->update($compress, $a->{digest}, -1) if ( $deltaInfo && length($a->{digest}) ); next if ( $a->{nlinks} == 0 || !$deltaInfo || !$attrCache ); # # If caller supplied deltaInfo and attrCache then updated the inodes too # my $aInode = $attrCache->getInode($a->{inode}); $aInode->{nlinks}--; if ( $aInode->{nlinks} <= 0 ) { $deltaInfo->update($compress, $aInode->{digest}, -1); $attrCache->deleteInode($a->{inode}); } else { $attrCache->setInode($a->{inode}, $aInode); } } } &$progressCB($fileCnt) if ( ref($progressCB) eq 'CODE' ); } else { # # the callback should know it's directories, not files in the non-ref # counting case # &$progressCB(1) if ( ref($progressCB) eq 'CODE' ); } } if ( $compress < -1 && ref($progressCB) eq 'CODE' ) { # # Do progress counting in the non-ref count case # (the callback should know it's directories, not files) # &$progressCB(1) if ( ref($progressCB) eq 'CODE' ); } # # Try first to simply unlink the file: this avoids an # extra stat for every file. If it fails (which it # will for directories), check if it is a directory and # then recurse. # if ( !unlink($name) ) { if ( -d $name ) { if ( !chdir($name) ) { print(STDERR "RmTreeQuietInner: can't chdir to $name (while removing $root)\n"); return 1; } my $d = BackupPC::DirOps::dirReadNames($bpc, "."); if ( !defined($d) ) { print(STDERR "Can't read $cwd/$path/$name: $!\n"); } else { @files = grep $_ !~ /^\.{1,2}$/, @$d; BackupPC::DirOps::RmTreeQuietInner($bpc, "$cwd/$name", \@files, $compress, $deltaInfo, $attrCache, $progressCB); if ( !chdir("..") ) { print(STDERR "RmTreeQuietInner: can't chdir .. (while removing $root)\n"); return 1; } rmdir($name) || rmdir($name); } } else { # # just try again # unlink($name) || unlink($name); } } } return 0; } 1; BackupPC-4.4.0/lib/BackupPC/Storage.pm0000444000047500004750000000554613673511776016301 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Storage package # # DESCRIPTION # # This library defines a BackupPC::Storage class for reading/writing # data like config, host info, backup and restore info. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2004-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Storage; use strict; use BackupPC::Storage::Text; use Data::Dumper; sub new { my $class = shift; my($paths) = @_; my $flds = { BackupFields => [qw( num type startTime endTime nFiles size nFilesExist sizeExist nFilesNew sizeNew xferErrs xferBadFile xferBadShare tarErrs compress sizeExistComp sizeNewComp noFill fillFromNum mangle xferMethod level charset version inodeLast keep share2path comment )], RestoreFields => [qw( num startTime endTime result errorMsg nFiles size tarCreateErrs xferErrs )], ArchiveFields => [qw( num startTime endTime result errorMsg )], }; return BackupPC::Storage::Text->new($flds, $paths, @_); } # # Writes per-backup information into the pc/nnn/backupInfo # file to allow later recovery of the pc/backups file in # cases when it is corrupted. # # Also updates the directory mtime to reflect the backup # finish time. # sub backupInfoWrite { my($class, $pcDir, $bkupNum, $bkupInfo, $force) = @_; my $bkupFd; return if ( !$force && -f "$pcDir/$bkupNum/backupInfo" ); my($dump) = Data::Dumper->new([$bkupInfo], [qw(*backupInfo)]); $dump->Indent(1); $dump->Sortkeys(1); if ( open($bkupFd, ">", "$pcDir/$bkupNum/backupInfo") ) { print($bkupFd $dump->Dump); close($bkupFd); } else { print("backupInfoWrite: can't open/create $pcDir/$bkupNum/backupInfo\n"); } utime($bkupInfo->{endTime}, $bkupInfo->{endTime}, "$pcDir/$bkupNum") if ( defined($bkupInfo->{endTime}) ); } 1; BackupPC-4.4.0/lib/BackupPC/Config/0000755000047500004750000000000013673511776015534 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/Config/Meta.pm0000444000047500004750000005002713673511776016762 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Config::Meta package # # DESCRIPTION # # This library defines a BackupPC::Config::Meta class. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2004-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Config::Meta; use strict; require Exporter; use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS ); use vars qw(%ConfigMeta); @ISA = qw(Exporter); @EXPORT = qw( ); @EXPORT_OK = qw( %ConfigMeta ); %EXPORT_TAGS = ('all' => [@EXPORT_OK]); # # Define the data types for all the config variables # %ConfigMeta = ( ###################################################################### # General server configuration ###################################################################### ServerHost => "string", ServerPort => "integer", ServerMesgSecret => "string", MyPath => {type => "string", undefIfEmpty => 1}, UmaskMode => "integer", WakeupSchedule => { type => "shortlist", child => "float", }, PoolV3Enabled => "boolean", MaxBackups => "integer", MaxUserBackups => "integer", MaxPendingCmds => "integer", MaxBackupPCNightlyJobs => "integer", BackupPCNightlyPeriod => "integer", PoolSizeNightlyUpdatePeriod => "integer", PoolNightlyDigestCheckPercent => "integer", MaxOldLogFiles => "integer", CmdQueueNice => "integer", SshPath => {type => "execPath", undefIfEmpty => 1}, NmbLookupPath => {type => "execPath", undefIfEmpty => 1}, PingPath => {type => "execPath", undefIfEmpty => 1}, Ping6Path => {type => "execPath", undefIfEmpty => 1}, DfPath => {type => "execPath", undefIfEmpty => 1}, DfCmd => "string", DfInodeUsageCmd => "string", SplitPath => {type => "execPath", undefIfEmpty => 1}, ParPath => {type => "execPath", undefIfEmpty => 1}, CatPath => {type => "execPath", undefIfEmpty => 1}, GzipPath => {type => "execPath", undefIfEmpty => 1}, Bzip2Path => {type => "execPath", undefIfEmpty => 1}, RrdToolPath => {type => "execPath", undefIfEmpty => 1}, DfMaxUsagePct => "float", DfMaxInodeUsagePct => "float", DHCPAddressRanges => { type => "list", emptyOk => 1, child => { type => "hash", noKeyEdit => 1, order => [qw(ipAddrBase first last)], child => { ipAddrBase => "string", first => "integer", last => "integer", }, }, }, BackupPCUser => "string", CgiDir => "string", InstallDir => "string", TopDir => "string", ConfDir => "string", LogDir => "string", RunDir => "string", BackupPCUserVerify => "boolean", HardLinkMax => "integer", PerlModuleLoad => { type => "list", emptyOk => 1, undefIfEmpty => 1, child => "string", }, ServerInitdPath => {type => "string", undefIfEmpty => 1}, ServerInitdStartCmd => "string", ###################################################################### # What to backup and when to do it # (can be overridden in the per-PC config.pl) ###################################################################### FullPeriod => "float", IncrPeriod => "float", FillCycle => "integer", FullKeepCnt => { type => "shortlist", child => "integer", }, FullKeepCntMin => "integer", FullAgeMax => "float", IncrKeepCnt => "integer", IncrKeepCntMin => "integer", IncrAgeMax => "float", BackupsDisable => "integer", RestoreInfoKeepCnt => "integer", ArchiveInfoKeepCnt => "integer", BackupFilesOnly => { type => "hash", keyText => "CfgEdit_Button_New_Share", emptyOk => 1, childType => { type => "list", emptyOk => 1, child => "string", }, }, BackupFilesExclude => { type => "hash", keyText => "CfgEdit_Button_New_Share", emptyOk => 1, childType => { type => "list", emptyOk => 1, child => "string", }, }, BlackoutBadPingLimit => "integer", BlackoutGoodCnt => "integer", BlackoutPeriods => { type => "list", emptyOk => 1, child => { type => "hash", noKeyEdit => 1, child => { hourBegin => "float", hourEnd => "float", weekDays => { type => "shortlist", child => "integer", }, }, }, }, BackupZeroFilesIsFatal => "boolean", ###################################################################### # How to backup a client ###################################################################### XferMethod => { type => "select", values => [qw(archive ftp rsync rsyncd smb tar)], }, XferLogLevel => "integer", ClientCharset => "string", ClientCharsetLegacy => "string", ClientShareName2Path => { type => "hash", keyText => "CfgEdit_Button_New_Share", emptyOk => 1, childType => "string", }, RefCntFsck => "integer", ###################################################################### # Smb Configuration ###################################################################### SmbShareName => { type => "list", child => "string", }, SmbShareUserName => "string", SmbSharePasswd => "string", SmbClientPath => {type => "execPath", undefIfEmpty => 1}, SmbClientFullCmd => "string", SmbClientIncrCmd => "string", SmbClientRestoreCmd => {type => "string", undefIfEmpty => 1}, ###################################################################### # Tar Configuration ###################################################################### TarShareName => { type => "list", child => "string", }, TarClientCmd => "string", TarFullArgs => "string", TarIncrArgs => "string", TarClientRestoreCmd => {type => "string", undefIfEmpty => 1}, TarClientPath => {type => "string", undefIfEmpty => 1}, ###################################################################### # Rsync Configuration ###################################################################### RsyncShareName => { type => "list", child => "string", }, RsyncBackupPCPath => {type => "execPath", undefIfEmpty => 1}, RsyncClientPath => {type => "string", undefIfEmpty => 1}, RsyncSshArgs => { type => "list", emptyOk => 1, child => "string", }, ###################################################################### # Rsyncd Configuration ###################################################################### RsyncdClientPort => "integer", RsyncdUserName => "string", RsyncdPasswd => "string", ###################################################################### # Rsync(d) Options ###################################################################### RsyncArgs => { type => "list", emptyOk => 1, child => "string", }, RsyncArgsExtra => { type => "list", emptyOk => 1, child => "string", }, RsyncRestoreArgs => { type => "list", emptyOk => 1, undefIfEmpty => 1, child => "string", }, RsyncRestoreArgsExtra => { type => "list", emptyOk => 1, undefIfEmpty => 1, child => "string", }, RsyncFullArgsExtra => { type => "list", emptyOk => 1, child => "string", }, RsyncIncrArgsExtra => { type => "list", emptyOk => 1, child => "string", }, ###################################################################### # FTP Configuration ###################################################################### FtpShareName => { type => "list", child => "string", }, FtpUserName => "string", FtpPasswd => "string", FtpPassive => "boolean", FtpBlockSize => "integer", FtpPort => "integer", FtpTimeout => "integer", FtpFollowSymlinks => "boolean", ###################################################################### # Archive Configuration ###################################################################### ArchiveDest => "string", ArchiveComp => { type => "select", values => [qw(none bzip2 gzip)], }, ArchivePar => "boolean", ArchiveSplit => "float", ArchiveClientCmd => "string", ###################################################################### # Other Client Configuration ###################################################################### NmbLookupCmd => "string", NmbLookupFindHostCmd => "string", ClientComment => "string", FixedIPNetBiosNameCheck => "boolean", PingCmd => "string", PingMaxMsec => "float", ClientTimeout => "integer", MaxOldPerPCLogFiles => "integer", CompressLevel => "integer", DumpPreUserCmd => {type => "string", undefIfEmpty => 1}, DumpPostUserCmd => {type => "string", undefIfEmpty => 1}, DumpPreShareCmd => {type => "string", undefIfEmpty => 1}, DumpPostShareCmd => {type => "string", undefIfEmpty => 1}, RestorePreUserCmd => {type => "string", undefIfEmpty => 1}, RestorePostUserCmd => {type => "string", undefIfEmpty => 1}, ArchivePreUserCmd => {type => "string", undefIfEmpty => 1}, ArchivePostUserCmd => {type => "string", undefIfEmpty => 1}, UserCmdCheckStatus => "boolean", ClientNameAlias => { type => "list", emptyOk => 1, undefIfEmpty => 1, child => "string", }, ###################################################################### # Email reminders, status and messages # (can be overridden in the per-PC config.pl) ###################################################################### SendmailPath => {type => "execPath", undefIfEmpty => 1}, EMailNotifyMinDays => "float", EMailFromUserName => "string", EMailAdminUserName => "string", EMailAdminSubject => "string", EMailUserDestDomain => "string", EMailNoBackupEverSubj => {type => "string", undefIfEmpty => 1}, EMailNoBackupEverMesg => {type => "bigstring", undefIfEmpty => 1}, EMailNotifyOldBackupDays => "float", EMailNoBackupRecentSubj => {type => "string", undefIfEmpty => 1}, EMailNoBackupRecentMesg => {type => "bigstring", undefIfEmpty => 1}, EMailNotifyOldOutlookDays => "float", EMailOutlookBackupSubj => {type => "string", undefIfEmpty => 1}, EMailOutlookBackupMesg => {type => "bigstring", undefIfEmpty => 1}, EMailHeaders => {type => "bigstring", undefIfEmpty => 1}, ###################################################################### # CGI user interface configuration settings ###################################################################### CgiAdminUserGroup => "string", CgiAdminUsers => "string", SCGIServerPort => "integer", CgiURL => "string", Language => { type => "select", values => [qw(cz de en es fr it ja nl pl pt_br ru uk zh_CN)], }, CgiUserHomePageCheck => "string", CgiUserUrlCreate => "string", CgiDateFormatMMDD => "integer", CgiNavBarAdminAllHosts => "boolean", CgiSearchBoxEnable => "boolean", CgiNavBarLinks => { type => "list", emptyOk => 1, child => { type => "hash", noKeyEdit => 1, child => { link => "string", lname => {type => "string", undefIfEmpty => 1}, name => {type => "string", undefIfEmpty => 1}, }, }, }, CgiStatusHilightColor => { type => "hash", noKeyEdit => 1, child => { Reason_backup_failed => "string", Reason_backup_done => "string", Reason_no_ping => "string", Reason_backup_canceled_by_user => "string", Status_backup_in_progress => "string", Disabled_OnlyManualBackups => "string", Disabled_AllBackupsDisabled => "string", }, }, CgiHeaders => "bigstring", CgiImageDir => "string", CgiExt2ContentType => { type => "hash", emptyOk => 1, childType => "string", }, CgiImageDirURL => "string", CgiCSSFile => "string", CgiUserDeleteBackupEnable => "integer", CgiUserConfigEditEnable => "boolean", CgiUserConfigEdit => { type => "hash", noKeyEdit => 1, child => { FullPeriod => "boolean", IncrPeriod => "boolean", FillCycle => "boolean", FullKeepCnt => "boolean", FullKeepCntMin => "boolean", FullAgeMax => "boolean", IncrKeepCnt => "boolean", IncrKeepCntMin => "boolean", IncrAgeMax => "boolean", RestoreInfoKeepCnt => "boolean", ArchiveInfoKeepCnt => "boolean", BackupFilesOnly => "boolean", BackupFilesExclude => "boolean", BackupsDisable => "boolean", BlackoutBadPingLimit => "boolean", BlackoutGoodCnt => "boolean", BlackoutPeriods => "boolean", BackupZeroFilesIsFatal => "boolean", XferMethod => "boolean", XferLogLevel => "boolean", ClientCharset => "boolean", ClientCharsetLegacy => "boolean", ClientShareName2Path => "boolean", RefCntFsck => "boolean", SmbShareName => "boolean", SmbShareUserName => "boolean", SmbSharePasswd => "boolean", SmbClientPath => "boolean", SmbClientFullCmd => "boolean", SmbClientIncrCmd => "boolean", SmbClientRestoreCmd => "boolean", TarShareName => "boolean", TarFullArgs => "boolean", TarIncrArgs => "boolean", TarClientCmd => "boolean", TarClientPath => "boolean", TarClientRestoreCmd => "boolean", RsyncShareName => "boolean", RsyncBackupPCPath => "boolean", RsyncdClientPort => "boolean", RsyncdUserName => "boolean", RsyncdPasswd => "boolean", RsyncArgs => "boolean", RsyncArgsExtra => "boolean", RsyncRestoreArgs => "boolean", RsyncRestoreArgsExtra => "boolean", RsyncFullArgsExtra => "boolean", RsyncIncrArgsExtra => "boolean", RsyncSshArgs => "boolean", RsyncClientPath => "boolean", FtpShareName => "boolean", FtpUserName => "boolean", FtpPasswd => "boolean", FtpBlockSize => "boolean", FtpPort => "boolean", FtpTimeout => "boolean", FtpFollowSymlinks => "boolean", FtpRestoreEnabled => "boolean", ArchiveDest => "boolean", ArchiveComp => "boolean", ArchivePar => "boolean", ArchiveSplit => "boolean", ArchiveClientCmd => "boolean", FixedIPNetBiosNameCheck => "boolean", PingMaxMsec => "boolean", NmbLookupCmd => "boolean", NmbLookupFindHostCmd => "boolean", PingCmd => "boolean", ClientTimeout => "boolean", MaxOldPerPCLogFiles => "boolean", CompressLevel => "boolean", ClientNameAlias => "boolean", ClientComment => "boolean", DumpPreUserCmd => "boolean", DumpPostUserCmd => "boolean", RestorePreUserCmd => "boolean", RestorePostUserCmd => "boolean", ArchivePreUserCmd => "boolean", ArchivePostUserCmd => "boolean", DumpPostShareCmd => "boolean", DumpPreShareCmd => "boolean", UserCmdCheckStatus => "boolean", EMailNotifyMinDays => "boolean", EMailFromUserName => "boolean", EMailAdminSubject => "boolean", EMailAdminUserName => "boolean", EMailUserDestDomain => "boolean", EMailNoBackupEverSubj => "boolean", EMailNoBackupEverMesg => "boolean", EMailNotifyOldBackupDays => "boolean", EMailNoBackupRecentSubj => "boolean", EMailNoBackupRecentMesg => "boolean", EMailNotifyOldOutlookDays => "boolean", EMailOutlookBackupSubj => "boolean", EMailOutlookBackupMesg => "boolean", EMailHeaders => "boolean", }, }, ###################################################################### # Fake config setting for editing the hosts ###################################################################### Hosts => { type => "list", emptyOk => 1, child => { type => "horizHash", order => [qw(host dhcp user moreUsers)], noKeyEdit => 1, child => { host => {type => "string", size => 20}, dhcp => {type => "boolean"}, user => {type => "string", size => 20}, moreUsers => {type => "string", size => 30}, }, }, }, ); 1; BackupPC-4.4.0/lib/BackupPC/Zip/0000755000047500004750000000000013673511776015071 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/Zip/FileMember.pm0000444000047500004750000001074413673511776017442 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Zip::FileMember # # DESCRIPTION # # This library defines a BackupPC::Zip::FileMember class that subclass # the Archive::Zip::FileMember class. This allows BackupPC_zipCreate # to create zip files by reading and uncomressing BackupPC's pool # files on the fly. This avoids the need to uncompress the files # ahead of time and either store them in memory or on disk. # # AUTHOR # Craig Barratt # Based on Archive::Zip::FileMember, Copyright (c) 2000 Ned Konz. # # COPYRIGHT # Copyright (C) 2002-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Zip::FileMember; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::FileMember ); BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :UTILITY_METHODS ) } # Given a file name, set up for eventual writing. sub newFromFileNamed # BackupPC::Zip::FileMember { my $class = shift; my $fileName = shift; my $newName = shift || $fileName; my $size = shift; my $compress = shift; return undef unless ( stat($fileName) && -r _ && !-d _ ); my $self = $class->new(@_); $self->fileName($newName); $self->{'externalFileName'} = $fileName; $self->{'compressionMethod'} = COMPRESSION_STORED; $self->{'compressedSize'} = $self->{'uncompressedSize'} = $size; $self->{'fileCompressLevel'} = $compress; $self->desiredCompressionMethod( ($self->compressedSize() > 0) ? COMPRESSION_DEFLATED : COMPRESSION_STORED ); $self->isTextFile(-T _ ); return $self; } sub rewindData # BackupPC::Zip::FileMember { my $self = shift; my $status = $self->SUPER::rewindData(@_); return $status unless $status == AZ_OK; return AZ_IO_ERROR unless $self->fh(); $self->fh()->rewind(); return AZ_OK; } sub fh # BackupPC::Zip::FileMember { my $self = shift; $self->_openFile() if !defined($self->{'bpcfh'}); return $self->{'bpcfh'}; } # opens my file handle from my file name sub _openFile # BackupPC::Zip::FileMember { my $self = shift; my($fh) = BackupPC::XS::FileZIO::open($self->externalFileName(), 0, $self->{'fileCompressLevel'}); if ( !defined($fh) ) { _ioError("Can't open", $self->externalFileName()); return undef; } $self->{'bpcfh'} = $fh; return $fh; } # Closes my file handle sub _closeFile # BackupPC::Zip::FileMember { my $self = shift; $self->{'bpcfh'}->close() if ( defined($self->{'bpcfh'}) ); $self->{'bpcfh'} = undef; } # Make sure I close my file handle sub endRead # BackupPC::Zip::FileMember { my $self = shift; $self->_closeFile(); return $self->SUPER::endRead(@_); } # Return bytes read. Note that first parameter is a ref to a buffer. # my $data; # my ($bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); sub _readRawChunk # BackupPC::Zip::FileMember { my($self, $dataRef, $chunkSize) = @_; return (0, AZ_OK) unless $chunkSize; my $bytesRead = $self->fh()->read($dataRef, $chunkSize) or return (0, _ioError("reading data")); return ($bytesRead, AZ_OK); } sub extractToFileNamed # BackupPC::Zip::FileMember { die("BackupPC::Zip::FileMember::extractToFileNamed not supported\n"); } # # There is a bug in Archive::Zip 1.30 that causes BackupPC_zipCreate # to fail when compression is on and it is writing to an unseekable # output file (eg: pipe or socket); see: # # https://rt.cpan.org/Public/Bug/Display.html?id=54827 # # We overload the bitFlag function here to avoid the bug. # sub bitFlag { my $self = shift; return $self->{bitFlag}; } BackupPC-4.4.0/lib/BackupPC/Lib.pm0000444000047500004750000011534613673511776015403 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::Lib package # # DESCRIPTION # # This library defines a BackupPC::Lib class and a variety of utility # functions used by BackupPC. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::Lib; use strict; use vars qw(%Conf %Lang); use Fcntl ':mode'; use Carp; use Socket; use Cwd; use Digest::MD5; use Config; use Encode qw/from_to encode_utf8/; use POSIX qw/_exit/; use BackupPC::Storage; use BackupPC::XS; use constant ZeroLengthMD5Digest => pack("H*", "d41d8cd98f00b204e9800998ecf8427e"); sub new { my $class = shift; my($topDir, $installDir, $confDir, $noUserCheck) = @_; # # Whether to use filesystem hierarchy standard for file layout. # If set, text config files are below /etc/BackupPC. # my $useFHS = 0; my $paths; # # Set defaults for $topDir and $installDir. # $topDir = '__TOPDIR__' if ( $topDir eq "" ); # updated by configure.pl $installDir = '__INSTALLDIR__' if ( $installDir eq "" ); # updated by configure.pl # # Pick some initial defaults. For FHS the only critical # path is the ConfDir, since we get everything else out # of the main config file. # if ( $useFHS ) { $paths = { useFHS => $useFHS, TopDir => $topDir, InstallDir => $installDir, ConfDir => $confDir eq "" ? '__CONFDIR__' : $confDir, # updated by configure.pl LogDir => '/var/log/BackupPC', RunDir => '/var/run/BackupPC', }; } else { $paths = { useFHS => $useFHS, TopDir => $topDir, InstallDir => $installDir, ConfDir => $confDir eq "" ? "$topDir/conf" : $confDir, LogDir => "$topDir/log", RunDir => "$topDir/log", }; } my $bpc = bless { %$paths, Version => '4.4.0' # updated by makeDist }, $class; $bpc->{storage} = BackupPC::Storage->new($paths); # # Clean up %ENV and setup other variables. # delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; if ( defined(my $error = $bpc->ConfigRead()) ) { print(STDERR $error, "\n"); return; } # # Update the paths based on the config file # foreach my $dir ( qw(TopDir ConfDir InstallDir LogDir RunDir) ) { next if ( $bpc->{Conf}{$dir} eq "" ); $paths->{$dir} = $bpc->{$dir} = $bpc->{Conf}{$dir}; } $bpc->{storage}->setPaths($paths); $bpc->{PoolDir} = "$bpc->{TopDir}/pool"; $bpc->{CPoolDir} = "$bpc->{TopDir}/cpool"; # # Verify we are running as the correct user # if ( !$noUserCheck && $bpc->{Conf}{BackupPCUserVerify} && $> != (my $uid = getpwnam($bpc->{Conf}{BackupPCUser})) ) { print(STDERR "$0: Wrong user: my userid is $>, instead of $uid ($bpc->{Conf}{BackupPCUser})\n"); print(STDERR "Please 'su [-m | -s shell] $bpc->{Conf}{BackupPCUser}' first\n"); return; } BackupPC::XS::Lib::ConfInit( $bpc->{TopDir}, $bpc->{Conf}{HardLinkMax}, $bpc->{Conf}{PoolV3Enabled}, $bpc->{Conf}{XferLogLevel} ); return $bpc; } sub TopDir { my($bpc) = @_; return $bpc->{TopDir}; } sub PoolDir { my($bpc, $compress) = @_; return $compress ? $bpc->{CPoolDir} : $bpc->{PoolDir}; } sub BinDir { my($bpc) = @_; return "$bpc->{InstallDir}/bin"; } sub LogDir { my($bpc) = @_; return $bpc->{LogDir}; } sub RunDir { my($bpc) = @_; return $bpc->{RunDir}; } sub ConfDir { my($bpc) = @_; return $bpc->{ConfDir}; } sub LibDir { my($bpc) = @_; return "$bpc->{InstallDir}/lib"; } sub InstallDir { my($bpc) = @_; return $bpc->{InstallDir}; } sub useFHS { my($bpc) = @_; return $bpc->{useFHS}; } sub Version { my($bpc) = @_; return $bpc->{Version}; } sub Conf { my($bpc) = @_; return %{$bpc->{Conf}}; } sub Lang { my($bpc) = @_; return $bpc->{Lang}; } sub scgiJob { return " scgi "; } sub adminJob { my($bpc, $num) = @_; return " admin " if ( !$num ); return " admin$num "; } sub isAdminJob { my($bpc, $str) = @_; return $str =~ /^ admin/; } sub ConfValue { my($bpc, $param) = @_; return $bpc->{Conf}{$param}; } sub verbose { my($bpc, $param) = @_; $bpc->{verbose} = $param if ( defined($param) ); return $bpc->{verbose}; } sub sigName2num { my($bpc, $sig) = @_; if ( !defined($bpc->{SigName2Num}) ) { my $i = 0; foreach my $name ( split(' ', $Config{sig_name}) ) { $bpc->{SigName2Num}{$name} = $i; $i++; } } return $bpc->{SigName2Num}{$sig}; } # # Generate an ISO 8601 format timeStamp (but without the "T"). # See http://www.w3.org/TR/NOTE-datetime and # http://www.cl.cam.ac.uk/~mgk25/iso-time.html # sub timeStamp { my($bpc, $t, $noPad) = @_; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($t || time); return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec) . ($noPad ? "" : " "); } sub BackupInfoRead { my($bpc, $host) = @_; return $bpc->{storage}->BackupInfoRead($host); } sub BackupInfoWrite { my($bpc, $host, @Backups) = @_; return $bpc->{storage}->BackupInfoWrite($host, @Backups); } sub RestoreInfoRead { my($bpc, $host) = @_; return $bpc->{storage}->RestoreInfoRead($host); } sub RestoreInfoWrite { my($bpc, $host, @Restores) = @_; return $bpc->{storage}->RestoreInfoWrite($host, @Restores); } sub ArchiveInfoRead { my($bpc, $host) = @_; return $bpc->{storage}->ArchiveInfoRead($host); } sub ArchiveInfoWrite { my($bpc, $host, @Archives) = @_; return $bpc->{storage}->ArchiveInfoWrite($host, @Archives); } sub ConfigDataRead { my($bpc, $host) = @_; return $bpc->{storage}->ConfigDataRead($host); } sub ConfigDataWrite { my($bpc, $host, $conf) = @_; return $bpc->{storage}->ConfigDataWrite($host, $conf); } sub ConfigRead { my($bpc, $host) = @_; my($ret); # # Read main config file # my($mesg, $config) = $bpc->{storage}->ConfigDataRead(); return $mesg if ( defined($mesg) ); $bpc->{Conf} = $config; # # Read host config file # if ( $host ne "" ) { ($mesg, $config) = $bpc->{storage}->ConfigDataRead($host, $config); return $mesg if ( defined($mesg) ); $bpc->{Conf} = $config; } # # Load optional perl modules # if ( defined($bpc->{Conf}{PerlModuleLoad}) ) { # # Load any user-specified perl modules. This is for # optional user-defined extensions. # $bpc->{Conf}{PerlModuleLoad} = [$bpc->{Conf}{PerlModuleLoad}] if ( ref($bpc->{Conf}{PerlModuleLoad}) ne "ARRAY" ); foreach my $module ( @{$bpc->{Conf}{PerlModuleLoad}} ) { eval("use $module;"); } } # # Load language file # return "No language setting" if ( !defined($bpc->{Conf}{Language}) ); my $langFile = "$bpc->{InstallDir}/lib/BackupPC/Lang/$bpc->{Conf}{Language}.pm"; if ( !defined($ret = do $langFile) && ($! || $@) ) { $mesg = "Couldn't open language file $langFile: $!" if ( $! ); $mesg = "Couldn't execute language file $langFile: $@" if ( $@ ); $mesg =~ s/[\n\r]+//; return $mesg; } $bpc->{Lang} = \%Lang; return; } # # Return the mtime of the config file # sub ConfigMTime { my($bpc) = @_; return $bpc->{storage}->ConfigMTime(); } # # Returns information from the host file in $bpc->{TopDir}/conf/hosts. # With no argument a ref to a hash of hosts is returned. Each # hash contains fields as specified in the hosts file. With an # argument a ref to a single hash is returned with information # for just that host. # sub HostInfoRead { my($bpc, $host) = @_; return $bpc->{storage}->HostInfoRead($host); } sub HostInfoWrite { my($bpc, $host) = @_; return $bpc->{storage}->HostInfoWrite($host); } # # Return the mtime of the hosts file # sub HostsMTime { my($bpc) = @_; return $bpc->{storage}->HostsMTime(); } # # Open a connection to the server. Returns an error string on failure. # Returns undef on success. # sub ServerConnect { my($bpc, $host, $port, $justConnect) = @_; local(*FH); return if ( defined($bpc->{ServerFD}) ); # # First try the unix-domain socket # my $sockFile = "$bpc->{RunDir}/BackupPC.sock"; socket(*FH, PF_UNIX, SOCK_STREAM, 0) || return "unix socket: $!"; if ( !connect(*FH, sockaddr_un($sockFile)) ) { my $err = "unix connect to $sockFile: $!"; close(*FH); if ( $port > 0 ) { my $proto = getprotobyname('tcp'); my $iaddr = inet_aton($host) || return "unknown host $host"; my $paddr = sockaddr_in($port, $iaddr); socket(*FH, PF_INET, SOCK_STREAM, $proto) || return "inet socket port $port: $!"; connect(*FH, $paddr) || return "inet connect port $port: $!"; } else { return $err; } } my($oldFH) = select(*FH); $| = 1; select($oldFH); $bpc->{ServerFD} = *FH; return if ( $justConnect ); # # Read the seed that we need for our MD5 message digest. See # ServerMesg below. # sysread($bpc->{ServerFD}, $bpc->{ServerSeed}, 1024); $bpc->{ServerMesgCnt} = 0; return; } # # Check that the server connection is still ok # sub ServerOK { my($bpc) = @_; return 0 if ( !defined($bpc->{ServerFD}) ); vec(my $FDread, fileno($bpc->{ServerFD}), 1) = 1; my $ein = $FDread; return 0 if ( select(my $rout = $FDread, undef, $ein, 0.0) < 0 ); return 1 if ( !vec($rout, fileno($bpc->{ServerFD}), 1) ); } # # Disconnect from the server # sub ServerDisconnect { my($bpc) = @_; return if ( !defined($bpc->{ServerFD}) ); close($bpc->{ServerFD}); delete($bpc->{ServerFD}); } # # Sends a message to the server and returns with the reply. # # To avoid possible attacks via the TCP socket interface, every client # message is protected by an MD5 digest. The MD5 digest includes four # items: # - a seed that is sent to us when we first connect # - a sequence number that increments for each message # - a shared secret that is stored in $Conf{ServerMesgSecret} # - the message itself. # The message is sent in plain text preceded by the MD5 digest. A # snooper can see the plain-text seed sent by BackupPC and plain-text # message, but cannot construct a valid MD5 digest since the secret in # $Conf{ServerMesgSecret} is unknown. A replay attack is not possible # since the seed changes on a per-connection and per-message basis. # sub ServerMesg { my($bpc, $mesg) = @_; return if ( !defined(my $fh = $bpc->{ServerFD}) ); $mesg =~ s/\n/\\n/g; $mesg =~ s/\r/\\r/g; my $md5 = Digest::MD5->new; $mesg = encode_utf8($mesg); $md5->add($bpc->{ServerSeed} . $bpc->{ServerMesgCnt} . $bpc->{Conf}{ServerMesgSecret} . $mesg); print($fh $md5->b64digest . " $mesg\n"); $bpc->{ServerMesgCnt}++; return <$fh>; } # # Do initialization for child processes # sub ChildInit { my($bpc) = @_; close(STDERR); open(STDERR, ">&STDOUT"); select(STDERR); $| = 1; select(STDOUT); $| = 1; $ENV{PATH} = $bpc->{Conf}{MyPath}; umask($bpc->{Conf}{UmaskMode}); } # # New digest calculation for BackupPC >= 4.X. # # Compute the MD5 digest of an entire file. # Returns the binary MD5 digest. # On error returns undef. # sub File2MD5 { my($bpc, $md5, $name) = @_; my($data, $fileSize); local(*N); $name = $1 if ( $name =~ /(.*)/ ); return undef if ( !open(N, $name) ); binmode(N); $md5->reset(); $md5->addfile(*N); close(N); return $md5->digest; } # # New digest calculation for BackupPC >= 4.X. # # Compute the MD5 digest of a buffer (string). # Returns the binary MD5 digest. # sub Buffer2MD5 { my($bpc, $md5, $dataRef) = @_; $md5->reset(); $md5->add($$dataRef); return $md5->digest; } # # Given a binary MD5 digest $d and a compress flag, return the # full path in the pool. We use the top 7 bits of the first # byte for the top-level directory and the top 7 bits of the # second byte for the 2nd-level directory. # sub MD52Path { my($bpc, $d, $compress, $poolDir) = @_; # # Injected fixed digest for collision testing on zero-sized file. # If you uncomment this line, you also need to rebuild rsync_bpc # and BackupPC::XS with the test code in bpc_digest_md52path() # enabled, and also force the match in bpc_poolWrite_write to # true. # # substr($d, 0, 16) = pack("H*", "d41d8cd98f00b204e9800998ecf8427e"); # return "/dev/null" if ( $d eq ZeroLengthMD5Digest ); my $b2 = vec($d, 0, 16); $poolDir = ($compress ? $bpc->{CPoolDir} : $bpc->{PoolDir}) if ( !defined($poolDir) ); return sprintf("%s/%02x/%02x/%s", $poolDir, ($b2 >> 8) & 0xfe, ($b2 >> 0) & 0xfe, unpack("H*", $d)); } # # V4 digest extension for MD5 collisions. # # Take the digest and append $extCnt in binary, with leading # 0x0 removed. That means when $extCnt == 0, nothing is # appended and the digest is the original 16 byte MD5 digest. # # Example: when $extCnt == 1 then 0x01 is appended (1 more byte). # When $extCnt == 258 then 0x0102 is appended (2 more bytes). # sub digestConcat { my($bpc, $digest, $extCnt, $compress) = @_; $digest = substr($digest, 16) if ( length($digest) > 16 ); my $ext = pack("N", $extCnt); $ext =~ s/^\x00+//; my $thisDigest = $digest . $ext; my $poolName = $bpc->MD52Path($thisDigest, $compress); return ($thisDigest, $poolName); } # # Given a digest from digestConcat() return the extension value # as an integer # sub digestExtGet { my($bpc, $digest) = @_; # # get the extension bytes, which start a byte 16. # also, prepend hour 0x0 bytes, then take the last 4 bytes. # this repads the extension to "N" format with leading 0x0 # bytes. # return unpack("N", substr(pack("N", 0) . substr($digest, 16), -4)); } # # Old Digest calculation for BackupPC <= 3.X. # # Compute the MD5 digest of a file. For efficiency we don't # use the whole file for big files: # - for files <= 256K we use the file size and the whole file. # - for files <= 1M we use the file size, the first 128K and # the last 128K. # - for files > 1M, we use the file size, the first 128K and # the 8th 128K (ie: the 128K up to 1MB). # See the documentation for a discussion of the tradeoffs in # how much data we use and how many collisions we get. # # Returns the MD5 digest (a hex string) and the file size. # sub File2MD5_v3 { my($bpc, $md5, $name) = @_; my($data, $fileSize); local(*N); $fileSize = (stat($name))[7]; return ("", -1) if ( !-f _ ); $name = $1 if ( $name =~ /(.*)/ ); return ("", 0) if ( $fileSize == 0 ); return ("", -1) if ( !open(N, $name) ); binmode(N); $md5->reset(); $md5->add($fileSize); if ( $fileSize > 262144 ) { # # read the first and last 131072 bytes of the file, # up to 1MB. # my $seekPosn = ($fileSize > 1048576 ? 1048576 : $fileSize) - 131072; $md5->add($data) if ( sysread(N, $data, 131072) ); $md5->add($data) if ( sysseek(N, $seekPosn, 0) && sysread(N, $data, 131072) ); } else { # # read the whole file # $md5->add($data) if ( sysread(N, $data, $fileSize) ); } close(N); return ($md5->hexdigest, $fileSize); } # # Old Digest calculation for BackupPC <= 3.X. # # Compute the MD5 digest of a buffer (string). For efficiency we don't # use the whole string for big strings: # - for files <= 256K we use the file size and the whole file. # - for files <= 1M we use the file size, the first 128K and # the last 128K. # - for files > 1M, we use the file size, the first 128K and # the 8th 128K (ie: the 128K up to 1MB). # See the documentation for a discussion of the tradeoffs in # how much data we use and how many collisions we get. # # Returns the MD5 digest (a hex string). # sub Buffer2MD5_v3 { my($bpc, $md5, $fileSize, $dataRef) = @_; $md5->reset(); $md5->add($fileSize); if ( $fileSize > 262144 ) { # # add the first and last 131072 bytes of the string, # up to 1MB. # my $seekPosn = ($fileSize > 1048576 ? 1048576 : $fileSize) - 131072; $md5->add(substr($$dataRef, 0, 131072)); $md5->add(substr($$dataRef, $seekPosn, 131072)); } else { # # add the whole string # $md5->add($$dataRef); } return $md5->hexdigest; } # # Old pool path for BackupPC <= 3.X. Prior to 4.X the pool # was stored in a directory tree 3 levels deep using the first # 3 hex digits of the digest. # # Given an MD5 digest $d and a compress flag, return the full # path in the pool. # sub MD52Path_v3 { my($bpc, $d, $compress, $poolDir) = @_; return if ( $d !~ m{(.)(.)(.)(.*)} ); $poolDir = ($compress ? $bpc->{CPoolDir} : $bpc->{PoolDir}) if ( !defined($poolDir) ); return "$poolDir/$1/$2/$3/$1$2$3$4"; } # # For each file, check if the file exists in $bpc->{TopDir}/pool. # If so, remove the file and make a hardlink to the file in # the pool. Otherwise, if the newFile flag is set, make a # hardlink in the pool to the new file. # # Returns 0 if a link should be made to a new file (ie: when the file # is a new file but the newFile flag is 0). # Returns 1 if a link to an existing file is made, # Returns 2 if a link to a new file is made (only if $newFile is set) # Returns negative on error. # sub MakeFileLink { my($bpc, $name, $d, $newFile, $compress) = @_; my($i, $rawFile); return -1 if ( !-f $name ); for ( $i = -1 ; ; $i++ ) { return -2 if ( !defined($rawFile = $bpc->MD52Path($d, $compress)) ); $rawFile .= "_$i" if ( $i >= 0 ); if ( -f $rawFile ) { if ( (stat(_))[3] < $bpc->{Conf}{HardLinkMax} && !compare($name, $rawFile) ) { unlink($name); return -3 if ( !link($rawFile, $name) ); return 1; } } elsif ( $newFile && -f $name && (stat($name))[3] == 1 ) { my($newDir); ($newDir = $rawFile) =~ s{(.*)/.*}{$1}; if ( !-d $newDir ) { eval { mkpath($newDir, 0, 0777) }; return -5 if ( $@ ); } return -4 if ( !link($name, $rawFile) ); return 2; } else { return 0; } } } # # Tests if we can create a hardlink from a file in directory # $newDir to a file in directory $targetDir. A temporary # file in $targetDir is created and an attempt to create a # hardlink of the same name in $newDir is made. The temporary # files are removed. # # Like link(), returns true on success and false on failure. # sub HardlinkTest { my($bpc, $targetDir, $newDir) = @_; my($targetFile, $newFile, $fd); for ( my $i = 0 ; ; $i++ ) { $targetFile = "$targetDir/.TestFileLink.$$.$i"; $newFile = "$newDir/.TestFileLink.$$.$i"; last if ( !-e $targetFile && !-e $newFile ); } return 0 if ( !open($fd, ">", $targetFile) ); close($fd); my $ret = link($targetFile, $newFile); unlink($targetFile); unlink($newFile); return $ret; } sub CheckHostAlive { my($bpc, $host) = @_; my($s, $pingCmd, $ret); # # Return success if the ping cmd is undefined or empty. # if ( $bpc->{Conf}{PingCmd} eq "" ) { print(STDERR "CheckHostAlive: return ok because \$Conf{PingCmd} is empty\n") if ( $bpc->{verbose} ); return 0; } my $args = { pingPath => $bpc->getPingPathByAddressType($host), host => $host, }; $pingCmd = $bpc->cmdVarSubstitute($bpc->{Conf}{PingCmd}, $args); # # Do a first ping in case the PC needs to wakeup # $s = $bpc->cmdSystemOrEval($pingCmd, undef, $args); if ( $? ) { my $str = $bpc->execCmd2ShellCmd(@$pingCmd); print(STDERR "CheckHostAlive: first ping ($str) failed ($?, $!)\n") if ( $bpc->{verbose} ); return -1; } # # Do a second ping and get the round-trip time in msec # $s = $bpc->cmdSystemOrEval($pingCmd, undef, $args); if ( $? ) { my $str = $bpc->execCmd2ShellCmd(@$pingCmd); print(STDERR "CheckHostAlive: second ping ($str) failed ($?, $!)\n") if ( $bpc->{verbose} ); return -1; } if ( $s =~ /rtt\s*min\/avg\/max\/mdev\s*=\s*[\d.]+\/([\d.]+)\/[\d.]+\/[\d.]+\s*(ms|usec)/i ) { $ret = $1; $ret /= 1000 if ( lc($2) eq "usec" ); } elsif ( $s =~ /time=([\d.]+)\s*(ms|usec)/i ) { $ret = $1; $ret /= 1000 if ( lc($2) eq "usec" ); } else { print(STDERR "CheckHostAlive: can't extract round-trip time (not fatal)\n") if ( $bpc->{verbose} ); $ret = 0; } if ( $bpc->{verbose} ) { my $str = $bpc->execCmd2ShellCmd(@$pingCmd); print(STDERR "CheckHostAlive: ran '$str'; returning $ret\n"); } return $ret; } sub CheckFileSystemUsage { my($bpc, $inode) = @_; my($topDir) = $bpc->{TopDir}; my($s, $dfCmd); my $cmd = $inode ? "DfInodeUsageCmd" : "DfCmd"; return 0 if ( $bpc->{Conf}{$cmd} eq "" ); my $args = { dfPath => $bpc->{Conf}{DfPath}, topDir => $bpc->{TopDir}, }; $dfCmd = $bpc->cmdVarSubstitute($bpc->{Conf}{$cmd}, $args); $s = $bpc->cmdSystemOrEval($dfCmd, undef, $args); return 0 if ( $? || $s !~ /(\d+)%/s ); return $1; } # # Given an IP address, return the host name and user name via # NetBios. # sub NetBiosInfoGet { my($bpc, $host) = @_; my($netBiosHostName, $netBiosUserName); my($s, $nmbCmd); # # Skip NetBios check if NmbLookupCmd is empty # if ( $bpc->{Conf}{NmbLookupCmd} eq "" ) { print(STDERR "NetBiosInfoGet: return $host because \$Conf{NmbLookupCmd} is empty\n") if ( $bpc->{verbose} ); return ($host, undef); } my $args = { nmbLookupPath => $bpc->{Conf}{NmbLookupPath}, host => $host, }; $nmbCmd = $bpc->cmdVarSubstitute($bpc->{Conf}{NmbLookupCmd}, $args); foreach ( split(/[\n\r]+/, $bpc->cmdSystemOrEval($nmbCmd, undef, $args)) ) { # # skip and other non entries # next if ( /<\w{2}> - /i ); next if ( !/^\s*([\w\s-]+?)\s*<(\w{2})\> - .*/i ); $netBiosHostName ||= $1 if ( $2 eq "00" ); # host is first 00 $netBiosUserName = $1 if ( $2 eq "03" ); # user is last 03 } if ( !defined($netBiosHostName) ) { print(STDERR "NetBiosInfoGet: failed: can't parse return string\n") if ( $bpc->{verbose} ); return; } $netBiosHostName = lc($netBiosHostName); $netBiosUserName = lc($netBiosUserName); print(STDERR "NetBiosInfoGet: success, returning host $netBiosHostName, user $netBiosUserName\n") if ( $bpc->{verbose} ); return ($netBiosHostName, $netBiosUserName); } # # Given a NetBios name lookup the IP address via NetBios. # In the case of a host returning multiple interfaces we # return the first IP address that matches the subnet mask. # If none match the subnet mask (or nmblookup doesn't print # the subnet mask) then just the first IP address is returned. # sub NetBiosHostIPFind { my($bpc, $host) = @_; my($netBiosHostName, $netBiosUserName); my($s, $nmbCmd, $subnet, $ipAddr, $firstIpAddr); # # Skip NetBios lookup if NmbLookupFindHostCmd is empty # if ( $bpc->{Conf}{NmbLookupFindHostCmd} eq "" ) { print(STDERR "NetBiosHostIPFind: return $host because \$Conf{NmbLookupFindHostCmd} is empty\n") if ( $bpc->{verbose} ); return $host; } my $args = { nmbLookupPath => $bpc->{Conf}{NmbLookupPath}, host => $host, }; $nmbCmd = $bpc->cmdVarSubstitute($bpc->{Conf}{NmbLookupFindHostCmd}, $args); foreach my $resp ( split(/[\n\r]+/, $bpc->cmdSystemOrEval($nmbCmd, undef, $args)) ) { if ( $resp =~ /querying\s+\Q$host\E\s+on\s+(\d+\.\d+\.\d+\.\d+)/i ) { $subnet = $1; $subnet = $1 if ( $subnet =~ /^(.*?)(\.255)+$/ ); } elsif ( $resp =~ /^\s*(\d+\.\d+\.\d+\.\d+)\s+\Q$host/ ) { my $ip = $1; $firstIpAddr = $ip if ( !defined($firstIpAddr) ); $ipAddr = $ip if ( !defined($ipAddr) && $ip =~ /^\Q$subnet/ ); } } $ipAddr = $firstIpAddr if ( !defined($ipAddr) ); if ( defined($ipAddr) ) { print(STDERR "NetBiosHostIPFind: found IP address $ipAddr for host $host\n") if ( $bpc->{verbose} ); return $ipAddr; } else { print(STDERR "NetBiosHostIPFind: couldn't find IP address for" . " host $host\n") if ( $bpc->{verbose} ); return; } } sub fileNameEltMangle { my($bpc, $name) = @_; return "" if ( $name eq "" ); $name =~ s{([%/\n\r])}{sprintf("%%%02x", ord($1))}eg; return "f$name"; } # # We store files with every name preceded by "f". This # avoids possible name conflicts with other information # we store in the same directories (eg: attribute info). # The process of turning a normal path into one with each # node prefixed with "f" is called mangling. # sub fileNameMangle { my($bpc, $name) = @_; $name =~ s{/([^/]+)}{"/" . $bpc->fileNameEltMangle($1)}eg; $name =~ s{^([^/]+)}{$bpc->fileNameEltMangle($1)}eg; return $name; } # # This undoes FileNameMangle # sub fileNameUnmangle { my($bpc, $name) = @_; $name =~ s{/f}{/}g; $name =~ s{^f}{}; $name =~ s{%(..)}{chr(hex($1))}eg; return $name; } # # Escape shell meta-characters with backslashes. # This should be applied to each argument separately, not an # entire shell command. # sub shellEscape { my($bpc, $cmd) = @_; $cmd =~ s/([][;&()<>{}|^\n\r\t *\$\\'"`?])/\\$1/g; return $cmd; } # # For printing exec commands (which don't use a shell) so they look like # a valid shell command this function should be called with the exec # args. The shell command string is returned. # sub execCmd2ShellCmd { my($bpc, @args) = @_; my $str; foreach my $a ( @args ) { $str .= " " if ( $str ne "" ); $str .= $bpc->shellEscape($a); } return $str; } # # Do a URI-style escape to protect/encode special characters # sub uriEsc { my($bpc, $s) = @_; $s =~ s{([^\w.\/-])}{sprintf("%%%02X", ord($1));}eg; return $s; } # # Do a URI-style unescape to restore special characters # sub uriUnesc { my($bpc, $s) = @_; $s =~ s{%(..)}{chr(hex($1))}eg; return $s; } # # Do variable substitution prior to execution of a command. # sub cmdVarSubstitute { my($bpc, $template, $vars) = @_; my(@cmd); # # Return without any substitution if the first entry starts with "&", # indicating this is perl code. # if ( (ref($template) eq "ARRAY" ? $template->[0] : $template) =~ /^\&/ ) { return ref($template) eq "ARRAY" ? $template : [$template]; } if ( ref($template) ne "ARRAY" ) { # # Split at white space, except if escaped by \ # $template = [split(/(?{$1}) && ref($vars->{$1}) ne "ARRAY" ? ($2 eq "+" ? $bpc->shellEscape($vars->{$1}) : $vars->{$1}) : "\${$1}$2" }eg; # # Now replicate any array arguments; this just works for just one # array var in each argument. # if ( $arg =~ m[(.*)\$\{(\w+)}(\+?)(.*)] && ref($vars->{$2}) eq "ARRAY" ) { my $pre = $1; my $var = $2; my $esc = $3; my $post = $4; foreach my $v ( @{$vars->{$var}} ) { $v = $bpc->shellEscape($v) if ( $esc eq "+" ); push(@cmd, "$pre$v$post"); } } else { push(@cmd, $arg); } } return \@cmd; } # # Exec or eval a command. $cmd is either a string on an array ref. # # @args are optional arguments for the eval() case; they are not used # for exec(). # sub cmdExecOrEval { my($bpc, $cmd, @args) = @_; if ( (ref($cmd) eq "ARRAY" ? $cmd->[0] : $cmd) =~ /^\&/ ) { $cmd = join(" ", @$cmd) if ( ref($cmd) eq "ARRAY" ); print(STDERR "cmdExecOrEval: about to eval perl code $cmd\n") if ( $bpc->{verbose} ); eval($cmd); print(STDERR "Perl code fragment for exec shouldn't return!!\n"); POSIX::_exit(1); } else { $cmd = [split(/\s+/, $cmd)] if ( ref($cmd) ne "ARRAY" ); print(STDERR "cmdExecOrEval: about to exec ", $bpc->execCmd2ShellCmd(@$cmd), "\n") if ( $bpc->{verbose} ); alarm(0); $cmd = [map {m/(.*)/} @$cmd]; # untaint # # force list-form of exec(), ie: no shell even for 1 arg # exec {$cmd->[0]} @$cmd; print(STDERR "Exec failed for @$cmd\n"); POSIX::_exit(1); } } # # System or eval a command. $cmd is either a string on an array ref. # $stdoutCB is a callback for output generated by the command. If it # is undef then output is returned. If it is a code ref then the function # is called with each piece of output as an argument. If it is a scalar # ref the output is appended to this variable. # # @args are optional arguments for the eval() case; they are not used # for system(). # # Also, $? should be set when the CHILD pipe is closed. # sub cmdSystemOrEvalLong { my($bpc, $cmd, $stdoutCB, $ignoreStderr, $pidHandlerCB, @args) = @_; my($pid, $out, $allOut); local(*CHILD); $? = 0; if ( (ref($cmd) eq "ARRAY" ? $cmd->[0] : $cmd) =~ /^\&/ ) { $cmd = join(" ", @$cmd) if ( ref($cmd) eq "ARRAY" ); print("cmdSystemOrEval: about to eval perl code $cmd\n") if ( $bpc->{verbose} ); $out = eval($cmd); $$stdoutCB .= $out if ( ref($stdoutCB) eq 'SCALAR' ); if ( ref($stdoutCB) eq 'CODE' ) { if ( $out !~ /\n$/ ) { if ( $@ ) { &$stdoutCB("Eval return value: $out; perl error $@\n"); } else { &$stdoutCB("Eval return value: $out\n"); } } else { &$stdoutCB($out); } } #print(STDERR "cmdSystemOrEval: finished: got output $out\n") # if ( $bpc->{verbose} ); return $out if ( !defined($stdoutCB) ); return; } else { $cmd = [split(/\s+/, $cmd)] if ( ref($cmd) ne "ARRAY" ); print(STDERR "cmdSystemOrEval: about to system ", $bpc->execCmd2ShellCmd(@$cmd), "\n") if ( $bpc->{verbose} ); if ( !defined($pid = open(CHILD, "-|")) ) { my $err = "Can't fork to run @$cmd\n"; $? = 1; $$stdoutCB .= $err if ( ref($stdoutCB) eq 'SCALAR' ); &$stdoutCB($err) if ( ref($stdoutCB) eq 'CODE' ); return $err if ( !defined($stdoutCB) ); return; } if ( !$pid ) { # # This is the child # close(STDERR); if ( $ignoreStderr ) { open(STDERR, ">", "/dev/null"); } else { open(STDERR, ">&STDOUT"); } alarm(0); $cmd = [map {m/(.*)/} @$cmd]; # untaint # # force list-form of exec(), ie: no shell even for 1 arg # exec {$cmd->[0]} @$cmd; print(STDERR "Exec of @$cmd failed\n"); POSIX::_exit(1); } # # Notify caller of child's pid # &$pidHandlerCB($pid) if ( ref($pidHandlerCB) eq "CODE" ); # # The parent gathers the output from the child # binmode(CHILD); while ( ) { $$stdoutCB .= $_ if ( ref($stdoutCB) eq 'SCALAR' ); &$stdoutCB($_) if ( ref($stdoutCB) eq 'CODE' ); $out .= $_ if ( !defined($stdoutCB) ); $allOut .= $_ if ( $bpc->{verbose} ); } $? = 0; close(CHILD); } #print(STDERR "cmdSystemOrEval: finished: got output $allOut\n") # if ( $bpc->{verbose} ); return $out; } # # The shorter version that sets $ignoreStderr = 0, ie: merges stdout # and stderr together. # sub cmdSystemOrEval { my($bpc, $cmd, $stdoutCB, @args) = @_; return $bpc->cmdSystemOrEvalLong($cmd, $stdoutCB, 0, undef, @args); } # # Promotes $conf->{BackupFilesOnly}, $conf->{BackupFilesExclude} # to hashes and $conf->{$shareName} to an array. # sub backupFileConfFix { my($bpc, $conf, $shareName) = @_; $conf->{$shareName} = [$conf->{$shareName}] if ( ref($conf->{$shareName}) ne "ARRAY" ); foreach my $param ( qw(BackupFilesOnly BackupFilesExclude) ) { next if ( !defined($conf->{$param}) ); if ( ref($conf->{$param}) eq "HASH" ) { # # A "*" entry means wildcard - it is the default for # all shares. Replicate the "*" entry for all shares, # but still allow override of specific entries. # next if ( !defined($conf->{$param}{"*"}) ); $conf->{$param} = {map({ $_ => $conf->{$param}{"*"} } @{$conf->{$shareName}}), %{$conf->{$param}}}; } else { $conf->{$param} = [$conf->{$param}] if ( ref($conf->{$param}) ne "ARRAY" ); $conf->{$param} = {map { $_ => $conf->{$param} } @{$conf->{$shareName}}}; } } } # # This is sort() compare function, used below. # # New client LOG names are LOG.MMYYYY. Old style names are # LOG, LOG.0, LOG.1 etc. Sort them so new names are # first, and newest to oldest. # sub compareLOGName { my $na = $1 if ( $a =~ /LOG\.(\d+)(\.z)?$/ ); my $nb = $1 if ( $b =~ /LOG\.(\d+)(\.z)?$/ ); $na = -1 if ( !defined($na) ); $nb = -1 if ( !defined($nb) ); if ( length($na) >= 5 && length($nb) >= 5 ) { # # Both new style: format is MMYYYY. Bigger dates are # more recent. # my $ma = $2 * 12 + $1 if ( $na =~ /(\d+)(\d{4})/ ); my $mb = $2 * 12 + $1 if ( $nb =~ /(\d+)(\d{4})/ ); return $mb - $ma; } elsif ( length($na) >= 5 && length($nb) < 5 ) { return -1; } elsif ( length($na) < 5 && length($nb) >= 5 ) { return 1; } else { # # Both old style. Smaller numbers are more recent. # return $na - $nb; } } # # Returns list of paths to a clients's (or main) LOG files, # most recent first. # sub sortedPCLogFiles { my($bpc, $host) = @_; my(@files, $dir); if ( $host ne "" ) { $dir = "$bpc->{TopDir}/pc/$host"; } else { $dir = "$bpc->{LogDir}"; } if ( opendir(DIR, $dir) ) { foreach my $file ( readdir(DIR) ) { next if ( !-f "$dir/$file" ); next if ( $file ne "LOG" && $file !~ /^LOG\.\d/ ); push(@files, "$dir/$file"); } closedir(DIR); } return sort compareLOGName @files; } # # Opens a writeable file handle to the per-client's LOG file. # Also ages LOG files if the LOG file is new # sub openPCLogFile { my($bpc, $client) = @_; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); my $logPath = sprintf("%s/pc/%s/LOG.%02d%04d", $bpc->{TopDir}, $client, $mon + 1, $year + 1900); my $logFd; if ( !-f $logPath ) { # # Compress and prune old log files # my $lastLog = $bpc->{Conf}{MaxOldPerPCLogFiles} - 1; foreach my $file ( $bpc->sortedPCLogFiles($client) ) { if ( $lastLog <= 0 ) { unlink($file); next; } $lastLog--; next if ( $file =~ /\.z$/ || !$bpc->{Conf}{CompressLevel} ); BackupPC::XS::compressCopy($file, "$file.z", undef, $bpc->{Conf}{CompressLevel}, 1); } } open($logFd, ">>", $logPath); return ($logFd, $logPath); } # # converts a glob-style pattern into a perl regular expression. # sub glob2re { my($bpc, $glob) = @_; my($char, $subst); # $escapeChars escapes characters with no special glob meaning but # have meaning in regexps. my $escapeChars = ['.', '/']; # $charMap is where we implement the special meaning of glob # patterns and translate them to regexps. my $charMap = { '?' => '[^/]', '*' => '[^/]*', }; # multiple forward slashes are equivalent to one slash. We should # never have to use this. $glob =~ s/\/+/\//; foreach $char ( @$escapeChars ) { $glob =~ s/\Q$char\E/\\$char/g; } while ( ($char, $subst) = each(%$charMap) ) { $glob =~ s/(?{'family'} == Socket::AF_INET6) ? 6 : 4; } # # Return pingPath depending on address type of target. # sub getPingPathByAddressType { my($bpc, $host) = @_; my $at = $bpc->getHostAddrInfo($host) || 4; return ($at == 6) ? $bpc->{Conf}{Ping6Path} : $bpc->{Conf}{PingPath}; } 1; BackupPC-4.4.0/lib/BackupPC/CGI/0000755000047500004750000000000013673511776014731 5ustar craigcraigBackupPC-4.4.0/lib/BackupPC/CGI/Browse.pm0000444000047500004750000003330313673511776016530 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::Browse package # # DESCRIPTION # # This module implements the Browse action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::Browse; use strict; use Encode qw/decode_utf8/; use BackupPC::CGI::Lib qw(:all); use BackupPC::View; use BackupPC::XS qw(:all); sub action { my $Privileged = CheckPermission($In{host}); my($i, $dirStr, $fileStr, $attr); my $checkBoxCnt = 0; if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_browse_backup_files}}")); } my $host = $In{host}; my $num = $In{num}; my $share = $In{share}; my $dir = $In{dir}; ErrorExit($Lang->{Empty_host_name}) if ( $host eq "" ); # # Find the requested backup and the previous filled backup # my @Backups = $bpc->BackupInfoRead($host); # # default to the newest backup # if ( !defined($In{num}) && @Backups > 0 ) { $i = @Backups - 1; $num = $Backups[$i]{num}; } for ( $i = 0 ; $i < @Backups ; $i++ ) { last if ( $Backups[$i]{num} == $num ); } if ( $i >= @Backups || $num !~ /^\d+$/ ) { ErrorExit("Backup number ${EscHTML($num)} for host ${EscHTML($host)} does not exist."); } if ( defined($In{comment}) && defined($In{SetComment}) && length($In{comment}) < 4096 ) { $Backups[$i]{comment} = $In{comment}; $bpc->BackupInfoWrite($host, @Backups); BackupPC::Storage->backupInfoWrite("$TopDir/pc/$host", $Backups[$i]{num}, $Backups[$i], 1); } my $backupTime = timeStamp2($Backups[$i]{startTime}); my $backupAge = sprintf("%.1f", (time - $Backups[$i]{startTime}) / (24 * 3600)); my $view = BackupPC::View->new($bpc, $host, \@Backups, {nlink => 1}); my $share2path = ref($Backups[$i]{share2path}) eq 'HASH' ? $Backups[$i]{share2path} : {}; my $comment = $Backups[$i]{comment}; if ( $dir eq "" || $dir eq "." || $dir eq ".." ) { $attr = $view->dirAttrib($num, "", ""); if ( keys(%$attr) > 0 ) { $share = (sort(keys(%$attr)))[-1]; $dir = '/'; } else { ErrorExit(eval("qq{$Lang->{Directory___EscHTML}}")); } } $dir = "/$dir" if ( $dir !~ /^\// ); my $relDir = $dir; my $currDir = undef; if ( $dir =~ m{(^|/)\.\.(/|$)} ) { ErrorExit($Lang->{Nice_try__but_you_can_t_put}); } # # Loop up the directory tree until we hit the top. # my(@DirStrPrev); while ( 1 ) { my($fLast, $fLastum, @DirStr); $attr = $view->dirAttrib($num, $share, $relDir); if ( !defined($attr) ) { $relDir = decode_utf8($relDir); ErrorExit(eval("qq{$Lang->{Can_t_browse_bad_directory_name2}}")); } my $fileCnt = 0; # file counter $fLast = $dirStr = ""; # # Loop over each of the files in this directory, putting the open directory first # foreach my $f ( sort { $currDir eq $a ? -1 : $currDir eq $b ? 1 : uc($a) cmp uc($b) } keys(%$attr) ) { my($dirOpen, $gotDir, $imgStr, $img, $path); my $fURI = $f; # URI escaped $f my $shareURI = $share; # URI escaped $share if ( $relDir eq "" ) { $path = "/$f"; } else { ($path = "$relDir/$f") =~ s{//+}{/}g; } if ( $shareURI eq "" ) { $shareURI = $f; $path = "/"; } $path =~ s{^/+}{/}; $path =~ s/([^\w.\/-])/uc sprintf("%%%02X", ord($1))/eg; $fURI =~ s/([^\w.\/-])/uc sprintf("%%%02X", ord($1))/eg; $shareURI =~ s/([^\w.\/-])/uc sprintf("%%%02X", ord($1))/eg; $dirOpen = 1 if ( defined($currDir) && $f eq $currDir ); if ( $attr->{$f}{type} == BPC_FTYPE_DIR ) { # # Display directory if it exists in current backup. # First find out if there are subdirs # my $subDirAttr = $share eq "" ? $view->dirAttrib($num, $f, "/") : $view->dirAttrib($num, $share, "$relDir/$f"); my $subDirCnt = 0; my $tdStyle; my $linkStyle = "fview"; foreach my $sub ( keys(%$subDirAttr) ) { next if ( $subDirAttr->{$sub}{type} != BPC_FTYPE_DIR ); $subDirCnt++; } $img |= 1 << 6; $img |= 1 << 5 if ( $subDirCnt ); if ( $dirOpen ) { $linkStyle = "fviewbold"; $img |= 1 << 2; $img |= 1 << 3 if ( $subDirCnt ); } my $imgFileName = sprintf("%07b.gif", $img); $imgStr = ""; if ( "$relDir/$f" eq $dir ) { $tdStyle = "fviewon"; } else { $tdStyle = "fviewoff"; } my $dirName = $f; $dirName =~ s/ / /g; $dirName = decode_utf8($dirName); push( @DirStr, { needTick => 1, tdArgs => " class=\"$tdStyle\"", link => <$imgStr $dirName EOF $fileCnt++; $gotDir = 1; if ( $dirOpen ) { my($lastTick, $doneLastTick); foreach my $d ( @DirStrPrev ) { $lastTick = $d if ( $d->{needTick} ); } $doneLastTick = 1 if ( !defined($lastTick) ); foreach my $d ( @DirStrPrev ) { $img = 0; if ( $d->{needTick} ) { $img |= 1 << 0; } if ( $d == $lastTick ) { $img |= 1 << 4; $doneLastTick = 1; } elsif ( !$doneLastTick ) { $img |= 1 << 3 | 1 << 4; } my $imgFileName = sprintf("%07b.gif", $img); $imgStr = ""; push( @DirStr, { needTick => 0, tdArgs => $d->{tdArgs}, link => $imgStr . $d->{link} } ); } } } if ( $relDir eq $dir ) { # # This is the selected directory, so display all the files # my($attrStr, $iconStr); if ( defined($a = $attr->{$f}) ) { my $mtimeStr = $bpc->timeStamp($a->{mtime}); # UGH -> fix this my $typeStr = BackupPC::XS::Attrib::fileType2Text($a->{type}); my $modeStr = sprintf("0%o", $a->{mode} & 07777); $iconStr = < EOF $attrStr .= <$typeStr $modeStr $a->{backupNum} $a->{size} $mtimeStr EOF } else { $attrStr .= " \n"; } (my $fDisp = "${EscHTML($f)}") =~ s/ / /g; $fDisp = decode_utf8($fDisp); if ( $gotDir ) { $fileStr .= <  $iconStr $fDisp $attrStr EOF } else { $fileStr .= <  $iconStr $fDisp $attrStr EOF } $checkBoxCnt++; } } @DirStrPrev = @DirStr; last if ( $relDir eq "" && $share eq "" ); # # Prune the last directory off $relDir, or at the very end # do the top-level directory. # if ( $relDir eq "" || $relDir eq "/" || $relDir !~ /(.*)\/(.*)/ ) { $currDir = $share; $share = ""; $relDir = ""; } else { $relDir = $1; $currDir = $2; } } $share = $currDir; my $shareURI = $share; $shareURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; # # allow each level of the directory path to be navigated to # my($thisPath, $dirDisplay, $lastDir); my $dirClean = $dir; $dirClean =~ s{//+}{/}g; $dirClean =~ s{/+$}{}; my @dirElts = split(/\//, $dirClean); @dirElts = ("/") if ( !@dirElts ); foreach my $d ( @dirElts ) { my($thisDir); if ( $thisPath eq "" ) { $thisDir = decode_utf8($share); $thisPath = "/"; } else { $thisPath .= "/" if ( $thisPath ne "/" ); $thisPath .= "$d"; $thisDir = decode_utf8($d); } my $thisPathURI = $thisPath; $thisPathURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; $dirDisplay .= "/" if ( $dirDisplay ne "" && $lastDir !~ m{/$} ); $dirDisplay .= "${EscHTML($thisDir)}"; $lastDir = $thisDir; } my $filledBackup; if ( (my @mergeNums = @{$view->mergeNums}) > 1 ) { shift(@mergeNums); my $numF = join(", #", @mergeNums); $filledBackup = eval("qq{$Lang->{This_display_is_merged_with_backup}}"); } foreach my $d ( @DirStrPrev ) { $dirStr .= "{tdArgs}>$d->{link}\n"; } ### hide checkall button if there are no files my($topCheckAll, $checkAll, $fileHeader); if ( $fileStr ) { $fileHeader = eval("qq{$Lang->{fileHeader}}"); $checkAll = $Lang->{checkAll}; # and put a checkall box on top if there are at least 20 files if ( $checkBoxCnt >= 20 ) { $topCheckAll = $checkAll; $topCheckAll =~ s{allFiles}{allFilestop}g; } } else { $fileStr = eval("qq{$Lang->{The_directory_is_empty}}"); } my $pathURI = $dir; $pathURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; if ( my @otherDirs = $view->backupList($share, $dir) ) { my $otherDirs; foreach my $i ( @otherDirs ) { my $selected; my $showDate = timeStamp2($Backups[$i]{startTime}); my $backupNum = $Backups[$i]{num}; $selected = " selected" if ( $backupNum == $num ); $otherDirs .= "\n"; } $filledBackup .= eval("qq{$Lang->{Visit_this_directory_in_backup}}"); } $dir = decode_utf8($dir); $share = decode_utf8($share); # # add an optional bullet describing the share2path mapping # (from $Conf{ClientShareName2Path} when the backup was done). # my $share2pathStr; foreach my $share ( sort(keys(%$share2path)) ) { my $shareUtf8 = decode_utf8($share); my $pathUtf8 = decode_utf8($share2path->{$share}); $share2pathStr .= "

  • $shareUtf8 → $pathUtf8
  • \n"; } if ( $share2pathStr ne "" ) { $share2pathStr = eval("qq{$Lang->{Browse_ClientShareName2Path}}"); } $comment = decode_utf8($comment); my $content = eval("qq{$Lang->{Backup_browse_for__host}}"); Header(eval("qq{$Lang->{Browse_backup__num_for__host}}"), $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/EditConfig.pm0000444000047500004750000016717313673511776017317 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::EditConfig package # # DESCRIPTION # # This module implements the EditConfig action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2005-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::EditConfig; use strict; use BackupPC::CGI::Lib qw(:all); use BackupPC::Config::Meta qw(:all); use BackupPC::Storage; use Data::Dumper; use Encode; my $debugText = ""; our %ConfigMenu = ( server => { text => "CfgEdit_Title_Server", param => [ {text => "CfgEdit_Title_General_Parameters"}, {name => "ServerHost"}, {name => "PoolV3Enabled"}, {name => "BackupPCUser"}, {name => "BackupPCUserVerify"}, {name => "MaxOldLogFiles"}, {text => "CfgEdit_Title_Wakeup_Schedule"}, {name => "WakeupSchedule"}, {text => "CfgEdit_Title_Concurrent_Jobs"}, {name => "MaxBackups"}, {name => "MaxUserBackups"}, {name => "MaxPendingCmds"}, {name => "MaxBackupPCNightlyJobs"}, {name => "BackupPCNightlyPeriod"}, {name => "PoolSizeNightlyUpdatePeriod"}, {name => "PoolNightlyDigestCheckPercent"}, {text => "CfgEdit_Title_Pool_Filesystem_Limits"}, {name => "DfCmd"}, {name => "DfMaxUsagePct"}, {name => "DfInodeUsageCmd"}, {name => "DfMaxInodeUsagePct"}, {name => "HardLinkMax"}, {text => "CfgEdit_Title_Other_Parameters"}, {name => "UmaskMode"}, {name => "MyPath"}, {name => "DHCPAddressRanges"}, {name => "CmdQueueNice"}, {name => "PerlModuleLoad"}, {name => "ServerInitdPath"}, {name => "ServerInitdStartCmd"}, {text => "CfgEdit_Title_Remote_Apache_Settings"}, {name => "ServerPort"}, {name => "ServerMesgSecret"}, {text => "CfgEdit_Title_Program_Paths"}, {name => "SshPath"}, {name => "NmbLookupPath"}, {name => "PingPath"}, {name => "Ping6Path"}, {name => "DfPath"}, {name => "SplitPath"}, {name => "ParPath"}, {name => "CatPath"}, {name => "GzipPath"}, {name => "Bzip2Path"}, {name => "RrdToolPath"}, {text => "CfgEdit_Title_Install_Paths"}, # # Can only edit TopDir and LogDir if we are in FHS mode. # Otherwise they are hardcoded in lib/BackupPC/Lib.pm. # { name => "TopDir", visible => sub { return $_[1]->useFHS(); } }, { name => "LogDir", visible => sub { return $_[1]->useFHS(); } }, { name => "RunDir", visible => sub { return $_[1]->useFHS(); } }, {name => "CgiDir"}, # # Cannot edit ConfDir or InstallDir, since the real value is hardcoded in # lib/BackupPC/Lib.pm. # {name => "ConfDir"}, # {name => "InstallDir"}, # ], }, email => { text => "CfgEdit_Title_Email", param => [ {text => "CfgEdit_Title_Email_settings"}, {name => "SendmailPath"}, {name => "EMailNotifyMinDays"}, {name => "EMailFromUserName"}, {name => "EMailAdminUserName"}, {name => "EMailAdminSubject"}, {name => "EMailUserDestDomain"}, {text => "CfgEdit_Title_Email_User_Messages"}, {name => "EMailNoBackupEverSubj"}, {name => "EMailNoBackupEverMesg"}, {name => "EMailNotifyOldBackupDays"}, {name => "EMailNoBackupRecentSubj"}, {name => "EMailNoBackupRecentMesg"}, {name => "EMailNotifyOldOutlookDays"}, {name => "EMailOutlookBackupSubj"}, {name => "EMailOutlookBackupMesg"}, {name => "EMailHeaders"}, ], }, cgi => { text => "CfgEdit_Title_CGI", param => [ {text => "CfgEdit_Title_Admin_Privileges"}, {name => "CgiAdminUserGroup"}, {name => "CgiAdminUsers"}, {text => "CfgEdit_Title_Page_Rendering"}, {name => "Language"}, {name => "CgiNavBarAdminAllHosts"}, {name => "CgiSearchBoxEnable"}, {name => "CgiNavBarLinks"}, {name => "CgiStatusHilightColor"}, {name => "CgiDateFormatMMDD"}, {name => "CgiHeaders"}, {name => "CgiExt2ContentType"}, {name => "CgiCSSFile"}, {text => "CfgEdit_Title_Paths"}, {name => "SCGIServerPort"}, {name => "CgiURL"}, {name => "CgiImageDir"}, {name => "CgiImageDirURL"}, {text => "CfgEdit_Title_User_URLs"}, {name => "CgiUserHomePageCheck"}, {name => "CgiUserUrlCreate"}, {text => "CfgEdit_Title_User_Config_Editing"}, {name => "CgiUserDeleteBackupEnable"}, {name => "CgiUserConfigEditEnable"}, {name => "CgiUserConfigEdit"}, ], }, xfer => { text => "CfgEdit_Title_Xfer", param => [ {text => "CfgEdit_Title_Xfer_Settings"}, {name => "XferMethod", onchangeSubmit => 1}, {name => "XferLogLevel"}, {name => "ClientCharset"}, {name => "ClientCharsetLegacy"}, {name => "ClientShareName2Path"}, {name => "RefCntFsck"}, ### Smb Settings { text => "CfgEdit_Title_Smb_Settings", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbShareName", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbShareUserName", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbSharePasswd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, ### Tar Settings { text => "CfgEdit_Title_Tar_Settings", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarShareName", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, ### Rsync Settings { text => "CfgEdit_Title_Rsync_Settings", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, { text => "CfgEdit_Title_Rsyncd_Settings", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, { name => "RsyncShareName", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncdUserName", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, { name => "RsyncdPasswd", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, ### Ftp Settings { text => "CfgEdit_Title_Ftp_Settings", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpShareName", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpUserName", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpPasswd", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpPassive", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpBlockSize", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpPort", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpTimeout", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, { name => "FtpFollowSymlinks", visible => sub { return $_[0]->{XferMethod} eq "ftp"; } }, ### Archive Settings { text => "CfgEdit_Title_Archive_Settings", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, { name => "ArchiveDest", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, { name => "ArchiveComp", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, { name => "ArchivePar", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, { name => "ArchiveSplit", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, ### Include/Exclude Settings { text => "CfgEdit_Title_Include_Exclude", visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, { name => "BackupFilesOnly", visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, { name => "BackupFilesExclude", visible => sub { return $_[0]->{XferMethod} ne "archive"; } }, ### Samba paths and commands { text => "CfgEdit_Title_Smb_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbClientPath", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbClientFullCmd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbClientIncrCmd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, { name => "SmbClientRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "smb"; } }, ### Tar paths and commands { text => "CfgEdit_Title_Tar_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarClientPath", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarClientCmd", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarFullArgs", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarIncrArgs", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, { name => "TarClientRestoreCmd", visible => sub { return $_[0]->{XferMethod} eq "tar"; } }, ### Rsync paths and commands { text => "CfgEdit_Title_Rsync_Paths_Commands_Args", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, { text => "CfgEdit_Title_Rsyncd_Port_Args", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, { name => "RsyncBackupPCPath", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncClientPath", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, { name => "RsyncSshArgs", visible => sub { return $_[0]->{XferMethod} eq "rsync"; } }, { name => "RsyncdClientPort", visible => sub { return $_[0]->{XferMethod} eq "rsyncd"; } }, { name => "RsyncArgs", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncArgsExtra", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncFullArgsExtra", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncIncrArgsExtra", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncRestoreArgs", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, { name => "RsyncRestoreArgsExtra", visible => sub { return $_[0]->{XferMethod} =~ /rsync/; } }, ### Archive paths and commands { text => "CfgEdit_Title_Archive_Paths_Commands", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, { name => "ArchiveClientCmd", visible => sub { return $_[0]->{XferMethod} eq "archive"; } }, ], }, schedule => { text => "CfgEdit_Title_Schedule", param => [ {text => "CfgEdit_Title_Full_Backups"}, {name => "FullPeriod"}, {name => "FillCycle"}, {name => "FullKeepCnt"}, {name => "FullKeepCntMin"}, {name => "FullAgeMax"}, {text => "CfgEdit_Title_Incremental_Backups"}, {name => "IncrPeriod"}, {name => "IncrKeepCnt"}, {name => "IncrKeepCntMin"}, {name => "IncrAgeMax"}, {text => "CfgEdit_Title_Blackouts"}, {name => "BackupsDisable"}, {name => "BlackoutBadPingLimit"}, {name => "BlackoutGoodCnt"}, {name => "BlackoutPeriods"}, {text => "CfgEdit_Title_Other"}, {name => "RestoreInfoKeepCnt"}, {name => "ArchiveInfoKeepCnt"}, {name => "BackupZeroFilesIsFatal"}, ], }, backup => { text => "CfgEdit_Title_Backup_Settings", param => [ {text => "CfgEdit_Title_Client_Lookup"}, {name => "ClientNameAlias"}, {name => "NmbLookupCmd"}, {name => "NmbLookupFindHostCmd"}, {name => "FixedIPNetBiosNameCheck"}, {name => "PingCmd"}, {name => "PingMaxMsec"}, {text => "CfgEdit_Title_Other"}, {name => "ClientComment"}, {name => "ClientTimeout"}, {name => "MaxOldPerPCLogFiles"}, {name => "CompressLevel"}, {text => "CfgEdit_Title_User_Commands"}, {name => "DumpPreUserCmd"}, {name => "DumpPostUserCmd"}, {name => "DumpPreShareCmd"}, {name => "DumpPostShareCmd"}, {name => "RestorePreUserCmd"}, {name => "RestorePostUserCmd"}, {name => "ArchivePreUserCmd"}, {name => "ArchivePostUserCmd"}, {name => "UserCmdCheckStatus"}, ], }, hosts => { text => "CfgEdit_Title_Hosts", param => [ {text => "CfgEdit_Title_Hosts"}, { name => "Hosts", comment => "CfgEdit_Hosts_Comment" }, ], }, ); sub action { my $pc_dir = "$TopDir/pc"; my($content, $contentHidden, $newConf, $override, $mainConf, $hostConf); my $errors = {}; my $host = $In{host}; my $menu = $In{menu} || "server"; my $hosts_path = $Hosts; my $config_path = $host eq "" ? "$TopDir/conf/config.pl" : "$TopDir/pc/$host/config.pl"; my $Privileged = CheckPermission($host) && ($PrivAdmin || $Conf{CgiUserConfigEditEnable}); my $userHost = 1 if ( defined($host) ); $debugText = ""; if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_edit_config_files}}")); } if ( defined($In{menu}) || $In{saveAction} eq "Save" ) { $errors = errorCheck(); if ( %$errors ) { # # If there are errors, then go back to the same menu # $In{saveAction} = ""; #$In{newMenu} = ""; } if ( (my $var = $In{overrideUncheck}) ne "" ) { # # a compound variable was unchecked; delete or # add extra variables to make the shape the same. # #print STDERR Dumper(\%In); foreach my $v ( sort(keys(%In)) ) { if ( $v =~ /^v_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) { delete($In{$v}) if ( !defined($In{"orig_$1"}) ); } if ( $v =~ /^orig_((zZ_|flds_)\Q$var\E(_zZ_.*|$))/ ) { $In{"v_$1"} = $In{$v}; } } #delete($In{"v_flds_$var"}); } ($newConf, $override) = inputParse($bpc, $userHost); $override = undef if ( $host eq "" ); } else { # # First time: pick up the current config settings # $mainConf = $bpc->ConfigDataRead(); if ( $host ne "" ) { $hostConf = $bpc->ConfigDataRead($host); $override = {}; foreach my $param ( sort(keys(%$hostConf)) ) { $override->{$param} = 1; } } else { my $hostInfo = $bpc->HostInfoRead(); $hostConf = {}; $mainConf->{Hosts} = [map($hostInfo->{$_}, sort(keys(%$hostInfo)))]; } $newConf = {%$mainConf, %$hostConf}; } if ( $In{saveAction} ne "Save" && $In{newMenu} ne "" && defined($ConfigMenu{$In{newMenu}}) ) { $menu = $In{newMenu}; } my %menuDisable; if ( $userHost ) { # # For a non-admin user editing the host config, we need to # figure out which subsets of the menu tree will be visible, # based on what is enabled. Admin users can edit all the # available per-host settings. # foreach my $m ( sort(keys(%ConfigMenu)) ) { my $enabled = 0; my $text = -1; my $n = 0; my @mask = (); foreach my $paramInfo ( @{$ConfigMenu{$m}{param}} ) { my $param = $paramInfo->{name}; if ( defined($paramInfo->{text}) ) { $mask[$n] = 1; if ( ref($paramInfo->{visible}) ne "CODE" || &{$paramInfo->{visible}}($newConf, $bpc) ) { $text = $n; } } else { if ( $bpc->{Conf}{CgiUserConfigEdit}{$param} || (defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) && $PrivAdmin) ) { $mask[$text] = 0 if ( $text >= 0 ); $mask[$n] = 0; $enabled ||= 1; } else { $mask[$n] = 1; } } $n++; } $menuDisable{$m}{mask} = \@mask; $menuDisable{$m}{top} = !$enabled; } if ( $menuDisable{$menu}{top} ) { # # Find an enabled menu if the current menu is empty # foreach my $m ( sort(keys(%menuDisable)) ) { if ( !$menuDisable{$m}{top} ) { $menu = $m; last; } } } } my $groupText; foreach my $m ( sort(keys(%ConfigMenu)) ) { next if ( $menuDisable{$m}{top} ); my $text = eval("qq($Lang->{$ConfigMenu{$m}{text}})"); if ( $m eq $menu ) { $groupText .= <$text EOF } else { $groupText .= <$text EOF } } if ( $host eq "" ) { $content .= eval("qq($Lang->{CfgEdit_Header_Main})"); } else { $content .= eval("qq($Lang->{CfgEdit_Header_Host})"); } my $saveStyle = ""; my $saveColor = "#ff0000"; if ( $In{modified} && $In{saveAction} ne "Save" && !%$errors ) { $saveStyle = "style=\"color:$saveColor\""; } else { $In{modified} = 0; } # # Add action and host to the URL so the nav bar link is # highlighted # my $url = "$MyURL?action=editConfig"; $url .= "&host=$host" if ( $host ne "" ); $content .= < $groupText

    EOF $content .= < EOF my $doneParam = {}; my $tblContent; # # There is a special case of the user deleting just the field # that has the error(s). So if the delete variable is a match # or parent to all the errors then ignore the errors. # if ( $In{deleteVar} ne "" && %$errors > 0 ) { my $matchAll = 1; foreach my $v ( keys(%$errors) ) { if ( $v ne $In{deleteVar} && $v !~ /^\Q$In{deleteVar}_zZ_/ ) { $matchAll = 0; last; } } $errors = {} if ( $matchAll ); } my $isError = %$errors; if ( !$isError && $In{saveAction} eq "Save" ) { my($mesg, $err); if ( $host ne "" ) { $hostConf = $bpc->ConfigDataRead($host) if ( !defined($hostConf) ); my %hostConf2 = %$hostConf; foreach my $param ( sort(keys(%$newConf)) ) { if ( $override->{$param} ) { $hostConf->{$param} = $newConf->{$param}; } else { delete($hostConf->{$param}); } } $mesg = configDiffMesg($host, \%hostConf2, $hostConf); $err .= $bpc->ConfigDataWrite($host, $hostConf); } else { $mainConf = $bpc->ConfigDataRead() if ( !defined($mainConf) ); my $hostsSave = []; my($hostsNew, $allHosts, $copyConf); foreach my $entry ( @{$newConf->{Hosts}} ) { next if ( $entry->{host} eq "" ); $allHosts->{$entry->{host}} = 1; $allHosts->{$1} = 1 if ( $entry->{host} =~ /(.+?)\s*=/ ); } foreach my $entry ( @{$newConf->{Hosts}} ) { next if ( $entry->{host} eq "" || defined($hostsNew->{lc($entry->{host})}) ); if ( $entry->{host} =~ /(.+?)\s*=\s*(.+)/ ) { if ( defined($allHosts->{$2}) ) { $entry->{host} = $1; $copyConf->{$1} = $2; } else { my $fullHost = $entry->{host}; my $copyHost = $2; $err .= eval("qq($Lang->{CfgEdit_Error_Copy_host_does_not_exist})"); } } push(@$hostsSave, $entry); $hostsNew->{lc($entry->{host})} = $entry; } ($mesg, my $hostChange) = hostsDiffMesg($hostsNew); $bpc->HostInfoWrite($hostsNew) if ( $hostChange ); foreach my $host ( sort(keys(%$copyConf)) ) { # # Currently host names are forced to lc when they # are read from the hosts file. Therefore we need # to force the from and to hosts to lc. # my $confData = $bpc->ConfigDataRead(lc($copyConf->{$host})); my $fromHost = $copyConf->{$host}; $err .= $bpc->ConfigDataWrite(lc($host), $confData); $mesg .= eval("qq($Lang->{CfgEdit_Log_Copy_host_config})"); } delete($newConf->{Hosts}); $mesg .= configDiffMesg(undef, $mainConf, $newConf); $mainConf = {%$mainConf, %$newConf}; $err .= $bpc->ConfigDataWrite(undef, $mainConf); $newConf->{Hosts} = $hostsSave; } if ( defined($err) ) { $tblContent .= <$err EOF } $bpc->ServerConnect(); if ( $mesg ne "" ) { (my $mesgBR = $mesg) =~ s/\n/
    \n/g; # uncomment this if you want the changes to be displayed # $tblContent .= <$mesgBR #EOF foreach my $str ( split(/\n/, $mesg) ) { $bpc->ServerMesg("log $str") if ( $str ne "" ); } } # # Tell the server to reload, unless we only changed # a client config # $bpc->ServerMesg("server reload") if ( $host eq "" ); } my @mask = @{$menuDisable{$menu}{mask} || []}; foreach my $paramInfo ( @{$ConfigMenu{$menu}{param}} ) { my $param = $paramInfo->{name}; my $disabled = shift(@mask); next if ( $disabled || $menuDisable{$menu}{top} ); if ( ref($paramInfo->{visible}) eq "CODE" && !&{$paramInfo->{visible}}($newConf, $bpc) ) { next; } if ( defined($paramInfo->{text}) ) { my $text = eval("qq($Lang->{$paramInfo->{text}})"); $tblContent .= <$text EOF next; } # # TODO: get parameter documentation # my $comment = ""; #$comment =~ s/\'//g; #$comment =~ s/\"//g; #$comment =~ s/\n/ /g; $doneParam->{$param} = 1; $tblContent .= fieldEditBuild( $ConfigMeta{$param}, $param, $newConf->{$param}, $errors, 0, $comment, $isError, $paramInfo->{onchangeSubmit}, defined($override) ? $param : undef, defined($override) ? $override->{$param} : undef ); if ( defined($paramInfo->{comment}) ) { my $topDir = $bpc->TopDir; my $text = eval("qq($Lang->{$paramInfo->{comment}})"); $tblContent .= <$text EOF } } # # Emit a summary of all the errors # my $errorTxt; if ( %$errors ) { $errorTxt .= <$Lang->{CfgEdit_Error_No_Save} EOF } foreach my $param ( sort(keys(%$errors)) ) { $errorTxt .= <$errors->{$param} EOF } $content .= <

    $debugText
    EOF # # Emit all the remaining editable config settings as hidden values # foreach my $param ( sort(keys(%ConfigMeta)) ) { next if ( $doneParam->{$param} ); next if ( $userHost && ( !defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) || ( !$PrivAdmin && !$bpc->{Conf}{CgiUserConfigEdit}{$param}) ) ); $content .= fieldHiddenBuild($ConfigMeta{$param}, $param, $newConf->{$param}, "v"); if ( defined($override) ) { $content .= < EOF } $doneParam->{$param} = 1; } if ( defined($In{menu}) || $In{saveAction} eq "Save" ) { if ( $In{saveAction} eq "Save" && !$userHost ) { # # Emit the new settings as orig_zZ_ parameters # $doneParam = {}; foreach my $param ( sort(keys(%ConfigMeta)) ) { next if ( $doneParam->{$param} ); next if ( $userHost && ( !defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) || ( !$PrivAdmin && !$bpc->{Conf}{CgiUserConfigEdit}{$param}) ) ); $contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, $param, $newConf->{$param}, "orig"); $doneParam->{$param} = 1; $In{modified} = 0; } } else { # # Just switching menus: copy all the orig_zZ_ input parameters # foreach my $var ( sort(keys(%In)) ) { if ( $var =~ /^orig_(zZ_|flds_)/ ) { my $val = decode_utf8($In{$var}); $contentHidden .= < EOF } } } } else { # # First time: emit all the original config settings # $doneParam = {}; foreach my $param ( sort(keys(%ConfigMeta)) ) { next if ( $doneParam->{$param} ); next if ( $userHost && ( !defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) || ( !$PrivAdmin && !$bpc->{Conf}{CgiUserConfigEdit}{$param}) ) ); $contentHidden .= fieldHiddenBuild($ConfigMeta{$param}, $param, $mainConf->{$param}, "orig"); $doneParam->{$param} = 1; } } $content .= < EOF Header("Config Edit", $content); Trailer(); } sub fieldHiddenBuild { my($type, $varName, $varValue, $prefix) = @_; my $content; $type = {type => $type} if ( ref($type) ne "HASH" ); if ( $type->{type} eq "list" ) { $varValue = [] if ( !defined($varValue) ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); for ( my $i = 0 ; $i < @$varValue ; $i++ ) { $content .= fieldHiddenBuild($type->{child}, "${varName}_zZ_$i", $varValue->[$i], $prefix); } } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { $varValue = {} if ( ref($varValue) ne "HASH" ); my(@order, $childType); if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { @order = sort(keys(%$varValue)); } for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { my $fld = $order[$fldNum]; if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; # # emit list of fields since they are user-defined # rather than hard-coded # $content .= < EOF } $content .= fieldHiddenBuild($childType, "${varName}_zZ_$fldNum", $varValue->{$fld}, $prefix); } } elsif ( $type->{type} eq "shortlist" ) { $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = join(", ", @$varValue); $content .= < EOF } else { $content .= < EOF } return $content; } sub fieldEditBuild { my($type, $varName, $varValue, $errors, $level, $comment, $isError, $onchangeSubmit, $overrideVar, $overrideSet) = @_; my $content; my $size = 50 - 10 * $level; $type = {type => $type} if ( ref($type) ne "HASH" ); $size = $type->{size} if ( defined($type->{size}) ); # # These fragments allow inline content to be turned on and off # # # $varName # if ( $level == 0 ) { my $lcVarName = lc($varName); $content .= <$varName EOF if ( defined($overrideVar) ) { my $override_checked = ""; if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_/ || !$isError && $In{insertVar} =~ /^\Q${varName}\E(_zZ_|$)/ || !$isError && $In{addVar} =~ /^\Q${varName}\E(_zZ_|$)/ ) { $overrideSet = 1; } if ( $overrideSet ) { $override_checked = "checked"; } $content .= <\ ${EscHTML($Lang->{CfgEdit_Button_Override})} EOF } $content .= "\n"; } if ( $type->{type} eq "list" ) { $content .= "\n"; $varValue = [] if ( !defined($varValue) ); $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); if ( !$isError && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 < @$varValue ) { # # User deleted entry in this array # splice(@$varValue, $1, 1) if ( @$varValue > 1 || $type->{emptyOk} ); $In{deleteVar} = ""; } if ( !$isError && $In{insertVar} =~ /^\Q${varName}_zZ_\E(\d+)$/ && $1 < @$varValue ) { # # User inserted entry in this array # splice(@$varValue, $1, 0, "") if ( @$varValue > 1 || $type->{emptyOk} ); $In{insertVar} = ""; } if ( !$isError && $In{addVar} eq $varName ) { # # User added entry to this array # push(@$varValue, undef); $In{addVar} = ""; } $content .= "\n"; my $colspan; if ( ref($type) eq "HASH" && ref($type->{child}) eq "HASH" && $type->{child}{type} eq "horizHash" ) { my @order; if ( defined($type->{child}{order}) ) { @order = @{$type->{child}{order}}; } else { @order = sort(keys(%{$type->{child}{child}})); } $content .= "\n"; for ( my $i = 0 ; $i < @order ; $i++ ) { $content .= "\n"; } $colspan = @order + 1; $content .= "\n"; for ( my $i = 0 ; $i < @$varValue ; $i++ ) { if ( @$varValue > 1 || $type->{emptyOk} ) { $content .= < EOF } $content .= fieldEditBuild( $type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet ); $content .= "\n"; } } else { for ( my $i = 0 ; $i < @$varValue ; $i++ ) { $content .= <\n"; $content .= fieldEditBuild( $type->{child}, "${varName}_zZ_$i", $varValue->[$i], $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet ); $content .= "\n"; } $colspan = 2; } $content .= <
    $order[$i]
    EOF if ( @$varValue > 1 || $type->{emptyOk} ) { $content .= < EOF } $content .= "
    EOF $content .= "\n"; } elsif ( $type->{type} eq "hash" ) { $content .= "\n"; $content .= "\n"; $varValue = {} if ( ref($varValue) ne "HASH" ); if ( !$isError && !$type->{noKeyEdit} && $In{deleteVar} !~ /^\Q${varName}_zZ_\E.*_zZ_/ && $In{deleteVar} =~ /^\Q${varName}_zZ_\E(.*)$/ ) { # # User deleted entry in this hash # delete($varValue->{$1}) if ( keys(%$varValue) > 1 || $type->{emptyOk} ); $In{deleteVar} = ""; } if ( !$isError && !defined($type->{child}) && $In{addVar} eq $varName ) { # # User added entry to this array # $varValue->{$In{"addVarKey_$varName"}} = "" if ( !defined($varValue->{$In{"addVarKey_$varName"}}) ); $In{addVar} = ""; } my(@order, $childType); if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { @order = sort(keys(%$varValue)); } for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { my $fld = $order[$fldNum]; $content .= <\n"; $content .= fieldEditBuild( $childType, "${varName}_zZ_$fldNum", $varValue->{$fld}, $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet ); $content .= "\n"; } if ( !$type->{noKeyEdit} ) { my $keyText = defined($type->{keyText}) ? $Lang->{$type->{keyText}} : $Lang->{CfgEdit_Button_New_Key}; $content .= < EOF } $content .= "
    $fld EOF if ( !$type->{noKeyEdit} && (keys(%$varValue) > 1 || $type->{emptyOk}) ) { $content .= < EOF } if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; # # emit list of fields since they are user-defined # rather than hard-coded # $content .= < EOF } $content .= "
    $keyText:
    \n"; $content .= "\n"; } elsif ( $type->{type} eq "horizHash" ) { $varValue = {} if ( ref($varValue) ne "HASH" ); my(@order, $childType); if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { @order = sort(keys(%$varValue)); } for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { my $fld = $order[$fldNum]; if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; # # emit list of fields since they are user-defined # rather than hard-coded # $content .= < EOF } $content .= fieldEditBuild( $childType, "${varName}_zZ_$fldNum", $varValue->{$fld}, $errors, $level + 1, undef, $isError, $onchangeSubmit, $overrideVar, $overrideSet ); } } else { $content .= "\n"; if ( $isError ) { # # If there was an error, we use the original post values # in %In, rather than the parsed values in $varValue. # This is so that the user's erroneous input is preserved. # $varValue = $In{"v_zZ_$varName"} if ( defined($In{"v_zZ_$varName"}) ); } if ( defined($errors->{$varName}) ) { $content .= <$errors->{$varName}
    EOF } my $onChange; if ( defined($overrideVar) ) { $onChange .= "checkboxSet('$overrideVar');"; } else { $onChange .= "varChange('$varName');"; } if ( $onchangeSubmit ) { $onChange .= "document.editForm.submit();"; } if ( $onChange ne "" ) { $onChange = " onChange=\"$onChange\""; } if ( $varValue !~ /\n/ && ( $type->{type} eq "integer" || $type->{type} eq "string" || $type->{type} eq "execPath" || $type->{type} eq "shortlist" || $type->{type} eq "float") ) { # simple input box if ( $type->{type} eq "shortlist" ) { $varValue = [$varValue] if ( ref($varValue) ne "ARRAY" ); $varValue = join(", ", @$varValue); } my $textType = ($varName =~ /Passwd/) ? "password" : "text"; $content .= < EOF } elsif ( $type->{type} eq "boolean" ) { # checkbox my $checked = "checked" if ( $varValue ); $content .= < EOF } elsif ( $type->{type} eq "select" ) { $content .= < EOF foreach my $option ( @{$type->{values}} ) { my $sel = " selected" if ( $varValue eq $option ); $content .= "$option\n"; } $content .= "\n"; } else { # multi-line text area - count number of lines my $rowCnt = $varValue =~ tr/\n//; $rowCnt = 1 if ( $rowCnt < 1 ); $content .= <${EscHTML($varValue)} EOF } $content .= "\n"; } return $content; } sub errorCheck { my $errors = {}; foreach my $param ( sort(keys(%ConfigMeta)) ) { fieldErrorCheck($ConfigMeta{$param}, $param, $errors); } return $errors; } sub fieldErrorCheck { my($type, $varName, $errors) = @_; $type = {type => $type} if ( ref($type) ne "HASH" ); if ( $type->{type} eq "list" ) { for ( my $i = 0 ; ; $i++ ) { last if ( fieldErrorCheck($type->{child}, "${varName}_zZ_$i", $errors) ); } } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { my(@order, $childType); my $ret; if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { for ( my $fldNum = 0 ; ; $fldNum++ ) { last if ( !defined($In{"v_flds_${varName}_zZ_$fldNum"}) ); push(@order, $In{"v_flds_${varName}_zZ_$fldNum"}); } } for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { my $fld = $order[$fldNum]; if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; } $ret ||= fieldErrorCheck($childType, "${varName}_zZ_$fldNum", $errors); } return $ret; } else { $In{"v_zZ_$varName"} = "0" if ( $type->{type} eq "boolean" && $In{"v_zZ_$varName"} eq "" ); return 1 if ( !exists($In{"v_zZ_$varName"}) ); (my $var = $varName) =~ s/_zZ_/./g; if ( $type->{type} eq "integer" || $type->{type} eq "boolean" ) { if ( $In{"v_zZ_$varName"} !~ /^-?\d+\s*$/s && $In{"v_zZ_$varName"} ne "" ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_an_integer}}"); } } elsif ( $type->{type} eq "float" ) { if ( $In{"v_zZ_$varName"} !~ /^-?\d*(\.\d*)?\s*$/s && $In{"v_zZ_$varName"} ne "" ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_real_valued_number}}"); } } elsif ( $type->{type} eq "shortlist" ) { my @vals = split(/[,\s]+/, $In{"v_zZ_$varName"}); for ( my $i = 0 ; $i < @vals ; $i++ ) { if ( $type->{child} eq "integer" && $vals[$i] !~ /^-?\d+\s*$/s && $vals[$i] ne "" ) { my $k = $i + 1; $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__must_be_an_integer}}"); } elsif ( $type->{child} eq "float" && $vals[$i] !~ /^-?\d*(\.\d*)?\s*$/s && $vals[$i] ne "" ) { my $k = $i + 1; $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__entry__must_be_real_valued_number}}"); } } } elsif ( $type->{type} eq "select" ) { my $match = 0; foreach my $option ( @{$type->{values}} ) { if ( $In{"v_zZ_$varName"} eq $option ) { $match = 1; last; } } $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_valid_option}}") if ( !$match ); } elsif ( $type->{type} eq "execPath" ) { if ( $In{"v_zZ_$varName"} ne "" && !-x $In{"v_zZ_$varName"} ) { $errors->{$varName} = eval("qq{$Lang->{CfgEdit_Error__must_be_executable_program}}"); } } else { # # $type->{type} eq "string": no error checking # } } return 0; } sub inputParse { my($bpc, $userHost) = @_; my $conf = {}; my $override = {}; foreach my $param ( sort(keys(%ConfigMeta)) ) { my $value; next if ( $userHost && ( !defined($bpc->{Conf}{CgiUserConfigEdit}{$param}) || ( !$PrivAdmin && !$bpc->{Conf}{CgiUserConfigEdit}{$param}) ) ); fieldInputParse($ConfigMeta{$param}, $param, \$value); $conf->{$param} = $value; $override->{$param} = $In{"override_$param"}; } return ($conf, $override); } sub fieldInputParse { my($type, $varName, $value) = @_; $type = {type => $type} if ( ref($type) ne "HASH" ); if ( $type->{type} eq "list" ) { $$value = []; for ( my $i = 0 ; ; $i++ ) { my $val; last if ( fieldInputParse($type->{child}, "${varName}_zZ_$i", \$val) ); push(@$$value, $val); } $$value = undef if ( $type->{undefIfEmpty} && @$$value == 0 ); } elsif ( $type->{type} eq "hash" || $type->{type} eq "horizHash" ) { my(@order, $childType); my $ret; $$value = {}; if ( defined($type->{order}) ) { @order = @{$type->{order}}; } elsif ( defined($type->{child}) ) { @order = sort(keys(%{$type->{child}})); } else { for ( my $fldNum = 0 ; ; $fldNum++ ) { last if ( !defined($In{"v_flds_${varName}_zZ_$fldNum"}) ); push(@order, $In{"v_flds_${varName}_zZ_$fldNum"}); } } for ( my $fldNum = 0 ; $fldNum < @order ; $fldNum++ ) { my $fld = $order[$fldNum]; my $val; if ( defined($type->{child}) ) { $childType = $type->{child}{$fld}; } else { $childType = $type->{childType}; } $ret ||= fieldInputParse($childType, "${varName}_zZ_$fldNum", \$val); last if ( $ret ); $$value->{$fld} = $val; } return $ret; } else { if ( $type->{type} eq "boolean" ) { $$value = 0 + $In{"v_zZ_$varName"}; } elsif ( !exists($In{"v_zZ_$varName"}) ) { return 1; } my $v = $In{"v_zZ_$varName"}; if ( $type->{type} eq "integer" ) { if ( $v =~ /^-?\d+\s*$/s || $v eq "" ) { $$value = 0 + $v; } else { # error value - keep in string form $$value = $v; } } elsif ( $type->{type} eq "float" ) { if ( $v =~ /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { $$value = 0 + $v; } else { # error value - keep in string form $$value = $v; } } elsif ( $type->{type} eq "shortlist" ) { $$value = [split(/[,\s]+/, $v)]; if ( $type->{child} eq "float" ) { foreach ( @$$value ) { if ( /^-?\d*(\.\d*)?\s*$/s || $v eq "" ) { $_ += 0; } } } elsif ( $type->{child} eq "integer" || $type->{child} eq "boolean" ) { foreach ( @$$value ) { if ( /^-?\d+\s*$/s || $v eq "" ) { $_ += 0; } } } } else { $$value = decode_utf8($In{"v_zZ_$varName"}); $$value =~ s/\r\n/\n/g; # remove leading space from exec paths $$value =~ s/^\s+// if ( $type->{type} eq "execPath" ); } $$value = undef if ( $type->{undefIfEmpty} && $$value eq "" ); } return 0; } sub configDiffMesg { my($host, $oldConf, $newConf) = @_; my $mesg; my $conf; if ( $host ne "" ) { $conf = "host $host config"; } else { $conf = "main config"; } foreach my $p ( sort(keys(%ConfigMeta)) ) { if ( !exists($oldConf->{$p}) && !exists($newConf->{$p}) ) { next; } elsif ( exists($oldConf->{$p}) && !exists($newConf->{$p}) ) { $mesg .= eval("qq($Lang->{CfgEdit_Log_Delete_param})"); } elsif ( !exists($oldConf->{$p}) && exists($newConf->{$p}) ) { my $dump = Data::Dumper->new([$newConf->{$p}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $value = $dump->Dump; $value =~ s/\n/\\n/g; $value =~ s/\r/\\r/g; if ( $p =~ /Passwd/ || $p =~ /Secret/ ) { $value = "'*'"; } $mesg .= eval("qq($Lang->{CfgEdit_Log_Add_param_value})"); } else { my $dump = Data::Dumper->new([$newConf->{$p}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $valueNew = $dump->Dump; my $v = $oldConf->{$p}; if ( ref($newConf->{$p}) eq "ARRAY" && ref($v) eq "" ) { $v = [$v]; } $dump = Data::Dumper->new([$v]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $valueOld = $dump->Dump; (my $valueNew2 = $valueNew) =~ s/['\n\r]//g; (my $valueOld2 = $valueOld) =~ s/['\n\r]//g; next if ( $valueOld2 eq $valueNew2 ); $valueNew =~ s/\n/\\n/g; $valueOld =~ s/\n/\\n/g; $valueNew =~ s/\r/\\r/g; $valueOld =~ s/\r/\\r/g; if ( $p =~ /Passwd/ || $p =~ /Secret/ ) { $valueNew = "'*'"; $valueOld = "'*'"; } $mesg .= eval("qq($Lang->{CfgEdit_Log_Change_param_value})"); } } return $mesg; } sub hostsDiffMesg { my($hostsNew) = @_; my $hostsOld = $bpc->HostInfoRead(); my($mesg, $hostChange); foreach my $host ( sort(keys(%$hostsOld)) ) { if ( !defined($hostsNew->{$host}) ) { $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Delete})"); $hostChange++; next; } foreach my $key ( sort(keys(%{$hostsNew->{$host}})) ) { next if ( $hostsNew->{$host}{$key} eq $hostsOld->{$host}{$key} ); my $valueOld = $hostsOld->{$host}{$key}; my $valueNew = $hostsNew->{$host}{$key}; $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Change})"); $hostChange++; } } foreach my $host ( sort(keys(%$hostsNew)) ) { next if ( defined($hostsOld->{$host}) ); my $dump = Data::Dumper->new([$hostsNew->{$host}]); $dump->Indent(0); $dump->Sortkeys(1); $dump->Terse(1); my $value = $dump->Dump; $value =~ s/\n/\\n/g; $value =~ s/\r/\\r/g; $mesg .= eval("qq($Lang->{CfgEdit_Log_Host_Add})"); $hostChange++; } return ($mesg, $hostChange); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/RestoreInfo.pm0000444000047500004750000000671013673511776017530 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::RestoreInfo package # # DESCRIPTION # # This module implements the RestoreInfo action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::RestoreInfo; use strict; use BackupPC::CGI::Lib qw(:all); use Encode qw/decode_utf8/; sub action { my $Privileged = CheckPermission($In{host}); my $host = $1 if ( $In{host} =~ /(.*)/ ); my $num = $In{num}; my $i; if ( !$Privileged ) { ErrorExit($Lang->{Only_privileged_users_can_view_restore_information}); } # # Find the requested restore # my @Restores = $bpc->RestoreInfoRead($host); for ( $i = 0 ; $i < @Restores ; $i++ ) { last if ( $Restores[$i]{num} == $num ); } if ( $i >= @Restores ) { ErrorExit(eval("qq{$Lang->{Restore_number__num_for_host__does_not_exist}}")); } %RestoreReq = (); do "$TopDir/pc/$host/RestoreInfo.$Restores[$i]{num}" if ( -f "$TopDir/pc/$host/RestoreInfo.$Restores[$i]{num}" ); my $startTime = timeStamp2($Restores[$i]{startTime}); my $reqTime = timeStamp2($RestoreReq{reqTime}); my $dur = $Restores[$i]{endTime} - $Restores[$i]{startTime}; $dur = 1 if ( $dur <= 0 ); my $duration = sprintf("%.1f", $dur / 60); my $MB = sprintf("%.1f", $Restores[$i]{size} / (1024 * 1024)); my $MBperSec = sprintf("%.2f", $Restores[$i]{size} / (1024 * 1024 * $dur)); my $fileListStr = ""; foreach my $f ( @{$RestoreReq{fileList}} ) { my $targetFile = $f; (my $strippedShareSrc = $RestoreReq{shareSrc}) =~ s/^\///; (my $strippedShareDest = $RestoreReq{shareDest}) =~ s/^\///; substr($targetFile, 0, length($RestoreReq{pathHdrSrc})) = $RestoreReq{pathHdrDest}; $targetFile =~ s{//+}{/}g; $strippedShareDest = decode_utf8($strippedShareDest); $targetFile = decode_utf8($targetFile); $strippedShareSrc = decode_utf8($strippedShareSrc); $f = decode_utf8($f); $fileListStr .= <$RestoreReq{hostSrc}:/$strippedShareSrc$f$RestoreReq{hostDest}:/$strippedShareDest$targetFile EOF } $RestoreReq{shareSrc} = decode_utf8($RestoreReq{shareSrc}); $RestoreReq{shareDest} = decode_utf8($RestoreReq{shareDest}); my $content = eval("qq{$Lang->{Restore___num_details_for__host2}}"); Header(eval("qq{$Lang->{Restore___num_details_for__host}}"), $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/ArchiveInfo.pm0000444000047500004750000000520413673511776017463 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::ArchiveInfo package # # DESCRIPTION # # This module implements the ArchiveInfo action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::ArchiveInfo; use strict; use BackupPC::CGI::Lib qw(:all); sub action { my $Privileged = CheckPermission($In{host}); my $host = $1 if ( $In{host} =~ /(.*)/ ); my $num = $In{num}; my $i; if ( !$Privileged ) { ErrorExit($Lang->{Only_privileged_users_can_view_archive_information}); } # # Find the requested archive # my @Archives = $bpc->ArchiveInfoRead($host); for ( $i = 0 ; $i < @Archives ; $i++ ) { last if ( $Archives[$i]{num} == $num ); } if ( $i >= @Archives ) { ErrorExit(eval("qq{$Lang->{Archive_number__num_for_host__does_not_exist}}")); } %ArchiveReq = (); do "$TopDir/pc/$host/ArchiveInfo.$Archives[$i]{num}" if ( -f "$TopDir/pc/$host/ArchiveInfo.$Archives[$i]{num}" ); my $startTime = timeStamp2($Archives[$i]{startTime}); my $reqTime = timeStamp2($ArchiveReq{reqTime}); my $dur = $Archives[$i]{endTime} - $Archives[$i]{startTime}; $dur = 1 if ( $dur <= 0 ); my $duration = sprintf("%.1f", $dur / 60); my $HostListStr = ""; my $counter = 0; foreach my $f ( @{$ArchiveReq{HostList}} ) { $HostListStr .= <$f@{$ArchiveReq{BackupList}}[$counter] EOF $counter++; } my $content = eval("qq{$Lang->{Archive___num_details_for__host2}}"); Header(eval("qq{$Lang->{Archive___num_details_for__host}}"), $content, 1); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/StopServer.pm0000444000047500004750000000316513673511776017406 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::StopServer package # # DESCRIPTION # # This module implements the StopServer action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::StopServer; use strict; use BackupPC::CGI::Lib qw(:all); sub action { if ( defined($bpc) && $bpc->ServerOK() ) { $bpc->ServerMesg("log User $User requested server shutdown"); $bpc->ServerMesg("server shutdown"); for ( my $i = 0 ; $i < 10 ; $i++ ) { last unless $bpc->ServerOK(); sleep(1); } sleep(2); } print $Cgi->redirect($MyURL); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/DirHistory.pm0000444000047500004750000002007513673511776017371 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::DirHistory package # # DESCRIPTION # # This module implements the DirHistory action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::DirHistory; use strict; use BackupPC::CGI::Lib qw(:all); use BackupPC::View; use BackupPC::XS qw(:all); use Encode; sub action { my $Privileged = CheckPermission($In{host}); my($i, $dirStr, $fileStr, $attr); my $checkBoxCnt = 0; if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_browse_backup_files}}")); } my $host = $In{host}; my $share = $In{share}; my $dir = $In{dir}; my $dirURI = $dir; my $shareURI = $share; $dirURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; $shareURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; ErrorExit($Lang->{Empty_host_name}) if ( $host eq "" ); my @Backups = $bpc->BackupInfoRead($host); my $view = BackupPC::View->new($bpc, $host, \@Backups, {inode => 1}); my $hist = $view->dirHistory($share, $dir); my($backupNumStr, $backupTimeStr, $fileStr); $dir = "/$dir" if ( $dir !~ /^\// ); if ( "/$host/$share/$dir/" =~ m{/\.\./} ) { ErrorExit($Lang->{Nice_try__but_you_can_t_put}); } my @backupList = $view->backupList($share, $dir); foreach $i ( @backupList ) { my $backupTime = timeStamp2($Backups[$i]{startTime}); my $num = $Backups[$i]{num}; $backupNumStr .= "$num"; $backupTimeStr .= "$backupTime"; } # # For V3 we rely on inodes to identify identical files. # # For V4 the (fake) inodes might be the same between different versions of # a file, so we rely on matching the digests instead. # # So, if digests are defined, we use those. Otherwise we used inodes. # foreach my $f ( sort { uc($a) cmp uc($b) } keys(%$hist) ) { my %inode2name; my %digest2name; my $nameCnt = 0; (my $fDisp = "${EscHTML($f)}") =~ s/ / /g; $fDisp = decode_utf8($fDisp); $fileStr .= "$fDisp"; my($colSpan, $url, $inode, $type, $digest); my $tdClass = ' class="histView"'; foreach $i ( @backupList ) { my($path); if ( $colSpan > 0 ) { # # The file is the same if it also size==0 (inode == -1) # or if it is a directory and the previous one is (inode == -2) # or if the inodes and digests agree and the types are the same. # if ( defined($hist->{$f}[$i]) && $hist->{$f}[$i]{type} == $type && ( ($hist->{$f}[$i]{size} == 0 && $inode == -1) || ($hist->{$f}[$i]{type} == BPC_FTYPE_DIR && $inode == -2) || ( length($hist->{$f}[$i]{digest}) ? $hist->{$f}[$i]{digest} eq $digest : $hist->{$f}[$i]{inode} == $inode ) ) ) { $colSpan++; next; } # # Also handle the case of a sequence of missing files # if ( !defined($hist->{$f}[$i]) && $inode == -3 ) { $colSpan++; next; } $fileStr .= "$url"; $colSpan = 0; $tdClass = ' class="histView"'; } if ( !defined($hist->{$f}[$i]) ) { $colSpan = 1; $url = " "; $inode = -3; # special value for missing $digest = ""; $tdClass = ' class="histViewMis"'; next; } if ( $dir eq "" ) { $path = "/$f"; } else { ($path = "$dir/$f") =~ s{//+}{/}g; } $path =~ s{^/+}{/}; $path =~ s/([^\w.\/-])/uc sprintf("%%%02X", ord($1))/eg; my $num = $hist->{$f}[$i]{backupNum}; if ( $hist->{$f}[$i]{type} == BPC_FTYPE_DIR ) { $inode = -2; # special value for dir $type = $hist->{$f}[$i]{type}; $url = <$Lang->{DirHistory_dirLink} EOF } else { my $thisName; $inode = $hist->{$f}[$i]{inode}; $digest = $hist->{$f}[$i]{digest}; $type = $hist->{$f}[$i]{type}; # # special value for empty file # $inode = -1 if ( $hist->{$f}[$i]{size} == 0 ); if ( length($digest) ) { if ( !defined($digest2name{$digest}) ) { $digest2name{$digest} = "$Lang->{DirHistory_fileLink}$nameCnt"; $nameCnt++; } $thisName = $digest2name{$digest}; } else { if ( !defined($inode2name{$inode}) ) { $inode2name{$inode} = "$Lang->{DirHistory_fileLink}$nameCnt"; $nameCnt++; } $thisName = $inode2name{$inode}; } $url = <$thisName EOF } $colSpan = 1; } if ( $colSpan > 0 ) { $fileStr .= "$url"; $colSpan = 0; } $fileStr .= "\n"; } # # allow each level of the directory path to be navigated to # my($thisPath, $dirDisplay); my $dirClean = $dir; $dirClean =~ s{//+}{/}g; $dirClean =~ s{/+$}{}; my @dirElts = split(/\//, $dirClean); @dirElts = ("/") if ( !@dirElts ); foreach my $d ( @dirElts ) { my($thisDir); if ( $thisPath eq "" ) { $thisDir = decode_utf8($share); $thisPath = "/"; } else { $thisPath .= "/" if ( $thisPath ne "/" ); $thisPath .= "$d"; $thisDir = decode_utf8($d); } my $thisPathURI = $thisPath; $thisPathURI =~ s/([^\w.\/-])/uc sprintf("%%%02x", ord($1))/eg; $dirDisplay .= "/" if ( $dirDisplay ne "" ); $dirDisplay .= "${EscHTML($thisDir)}"; } my $content = eval("qq{$Lang->{DirHistory_for__host}}"); Header(eval("qq{$Lang->{DirHistory_backup_for__host}}"), $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/DeleteBackup.pm0000444000047500004750000000523313673511776017620 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::DeleteBackup package # # DESCRIPTION # # This module implements the DeleteBackup action for the CGI interface. # # AUTHORS # Craig Barratt # Alexander Moisseev # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # Copyright (C) 2017 Alexander Moisseev # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.github.io/backuppc # #======================================================================== package BackupPC::CGI::DeleteBackup; use strict; use warnings; use BackupPC::CGI::Lib qw(:all); use Encode qw(decode_utf8); sub action { my($str, $reply); my $host = $In{host}; my $Privileged = CheckPermission($host) && ($PrivAdmin || $Conf{CgiUserDeleteBackupEnable} > 0); $Privileged = 0 if ( $Conf{CgiUserDeleteBackupEnable} < 0 ); if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_delete_backups}}")); } if ( $In{num} !~ /^\d+$/ || $In{type} !~ /^\w*$/ || $In{nofill} !~ /^\d*$/ ) { ErrorExit("Backup number ${EscHTML($In{num})} for host ${EscHTML($host)} does not exist."); } my $num = $In{num}; my $filled = $In{nofill} ? $Lang->{An_unfilled} : $Lang->{A_filled}; my $type = $Lang->{$In{type}}; ServerConnect(); if ( $In{doit} ) { $str = eval("qq{$Lang->{Delete_requested_for_backup_of__host_by__User}}"); $bpc->ServerMesg("log $str"); $reply = $bpc->ServerMesg("delete $User ${EscURI($host)} $num -r"); my $content = eval("qq{$Lang->{REPLY_FROM_SERVER}}"); Header(eval("qq{$Lang->{BackupPC__Delete_Requested_for_a_backup_of__host}}"), $content); } else { my $content = eval("qq{$Lang->{Are_you_sure_delete}}"); Header(eval("qq{$Lang->{BackupPC__Delete_Backup_Confirm__num_of__host}}"), $content); } Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/HostInfo.pm0000444000047500004750000004704013673511776017023 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::HostInfo package # # DESCRIPTION # # This module implements the HostInfo action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::HostInfo; use strict; use Encode qw/decode_utf8/; use BackupPC::CGI::Lib qw(:all); sub action { my $host = $1 if ( $In{host} =~ /(.*)/ ); my($statusStr, $startIncrStr); $host =~ s/^\s+//; $host =~ s/\s+$//; if ( $host eq "" ) { ErrorExit(eval("qq{$Lang->{Unknown_host_or_user}}")); } $host = lc($host) if ( !-d "$TopDir/pc/$host" && -d "$TopDir/pc/" . lc($host) ); if ( $host =~ /\.\./ || !-d "$TopDir/pc/$host" ) { # # try to lookup by user name # if ( $host eq "" || !defined($Hosts->{$host}) ) { foreach my $h ( keys(%$Hosts) ) { if ( $Hosts->{$h}{user} eq $host || lc($Hosts->{$h}{user}) eq lc($host) ) { $host = $h; last; } } CheckPermission(); ErrorExit(eval("qq{$Lang->{Unknown_host_or_user}}")) if ( !defined($Hosts->{$host}) ); } $In{host} = $host; } GetStatusInfo("host(${EscURI($host)})"); $bpc->ConfigRead($host); %Conf = $bpc->Conf(); my $Privileged = CheckPermission($host); if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_view_information_about}}")); } if ( $In{action} eq "keepBackup" ) { my $num = $In{num}; my $keep = $In{keep}; my $i; if ( $num !~ /^\d+$/ ) { ErrorExit("Backup number ${EscHTML($In{num})} for host ${EscHTML($host)} does not exist."); } my @Backups = $bpc->BackupInfoRead($host); for ( $i = 0 ; $i < @Backups ; $i++ ) { if ( $Backups[$i]{num} == $num ) { if ( !$Backups[$i]{noFill} && $Backups[$i]{keep} != ($keep ? 1 : 0) ) { $Backups[$i]{keep} = $keep ? 1 : 0; $bpc->BackupInfoWrite($host, @Backups); BackupPC::Storage->backupInfoWrite("$TopDir/pc/$host", $Backups[$i]{num}, $Backups[$i], 1); } last; } } if ( $i >= @Backups ) { ErrorExit("Backup number ${EscHTML($In{num})} for host ${EscHTML($host)} does not exist."); } } my $deleteEnabled = $PrivAdmin || ($Conf{CgiUserDeleteBackupEnable} > 0 && $Privileged); $deleteEnabled = 0 if ( $Conf{CgiUserDeleteBackupEnable} < 0 ); ReadUserEmailInfo(); if ( $Conf{XferMethod} eq "archive" ) { my @Archives = $bpc->ArchiveInfoRead($host); my($ArchiveStr, $warnStr); for ( my $i = 0 ; $i < @Archives ; $i++ ) { my $startTime = timeStamp2($Archives[$i]{startTime}); my $dur = $Archives[$i]{endTime} - $Archives[$i]{startTime}; $dur = 1 if ( $dur <= 0 ); my $duration = sprintf("%.1f", $dur / 60); my $Archives_Result = $Lang->{failed}; if ( $Archives[$i]{result} ne "failed" ) { $Archives_Result = $Lang->{success}; } $ArchiveStr .= <$Archives[$i]{num} $Archives_Result $startTime $duration EOF } if ( $ArchiveStr ne "" ) { $ArchiveStr = eval("qq{$Lang->{Archive_Summary}}"); } if ( @Archives == 0 ) { $warnStr = $Lang->{There_have_been_no_archives}; } if ( $StatusHost{BgQueueOn} ) { $statusStr .= eval("qq{$Lang->{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon}}"); } if ( $StatusHost{UserQueueOn} ) { $statusStr .= eval("qq{$Lang->{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon}}"); } if ( $StatusHost{CmdQueueOn} ) { $statusStr .= eval("qq{$Lang->{A_command_for_host_is_on_the_command_queue_will_run_soon}}"); } my $content = eval("qq{$Lang->{Host__host_Archive_Summary2}}"); Header(eval("qq{$Lang->{Host__host_Archive_Summary}}"), $content, 1); Trailer(); return; } # # Normal, non-archive case # my @Backups = $bpc->BackupInfoRead($host); my(@bkpRows, @sizeRows, @compRows, @errRows, @warnRows, $deleteHdrStr); $deleteHdrStr = ' ' if ( $deleteEnabled ); for ( my $i = 0 ; $i < @Backups ; $i++ ) { my($MBExistComp, $ExistComp, $MBNewComp, $NewComp); my($dur, $duration, $MB, $MBperSec, $MBExist, $MBNew); my $startTime = timeStamp2($Backups[$i]{startTime}); # # if a backup is active, but there is no job, then force it to be displayed # as partial. this handles case of a forced exit of BackupPC without normal # cleanup # $Backups[$i]{type} = "partial" if ( $Backups[$i]{type} eq "active" && !defined($StatusHost{Job}) ); if ( $Backups[$i]{type} ne "active" ) { $dur = $Backups[$i]{endTime} - $Backups[$i]{startTime}; $dur = 1 if ( $dur <= 0 ); $duration = sprintf("%.1f", $dur / 60); $MB = sprintf("%.1f", $Backups[$i]{size} / (1024 * 1024)); $MBperSec = sprintf("%.2f", $Backups[$i]{size} / (1024 * 1024 * $dur)); $MBExist = sprintf("%.1f", $Backups[$i]{sizeExist} / (1024 * 1024)); $MBNew = sprintf("%.1f", $Backups[$i]{sizeNew} / (1024 * 1024)); if ( $Backups[$i]{sizeExist} && $Backups[$i]{sizeExistComp} ) { $MBExistComp = sprintf("%.1f", $Backups[$i]{sizeExistComp} / (1024 * 1024)); $ExistComp = sprintf("%.1f%%", 100 * (1 - $Backups[$i]{sizeExistComp} / $Backups[$i]{sizeExist})); } if ( $Backups[$i]{sizeNew} && $Backups[$i]{sizeNewComp} ) { $MBNewComp = sprintf("%.1f", $Backups[$i]{sizeNewComp} / (1024 * 1024)); $NewComp = sprintf("%.1f%%", 100 * (1 - $Backups[$i]{sizeNewComp} / $Backups[$i]{sizeNew})); } } my $age = sprintf("%.1f", (time - $Backups[$i]{startTime}) / (24 * 3600)); my $browseURL = "$MyURL?action=browse&host=${EscURI($host)}&num=$Backups[$i]{num}"; my $level = $Backups[$i]{level}; my $filled = $Backups[$i]{noFill} ? $Lang->{No} : $Lang->{Yes}; $filled .= " ($Backups[$i]{fillFromNum}) " if ( $Backups[$i]{fillFromNum} ne "" ); my $ltype = $Lang->{"backupType_$Backups[$i]{type}"}; my $keepOrDeleteStr = " \n"; if ( !$Backups[$i]{noFill} && ($i < @Backups - 1 || $Backups[$i]{type} eq "full") ) { my $keepChecked = $Backups[$i]{keep} ? " checked" : ""; $keepOrDeleteStr .= < $Backups[$i]{keep} EOF } $keepOrDeleteStr .= " \n \n"; if ( (!$Backups[$i]{keep} || $Backups[$i]{noFill}) && $deleteEnabled ) { $keepOrDeleteStr .= < EOF } $keepOrDeleteStr .= " \n"; my $comment = decode_utf8($Backups[$i]{comment}); push @bkpRows, < $Backups[$i]{num} $ltype $filled $level $startTime $duration $age $keepOrDeleteStr $comment EOF push @sizeRows, < $Backups[$i]{num} $ltype $Backups[$i]{nFiles} $MB $MBperSec $Backups[$i]{nFilesExist} $MBExist $Backups[$i]{nFilesNew} $MBNew EOF my $is_compress = $Backups[$i]{compress} || $Lang->{off}; if ( !$ExistComp ) { $ExistComp = " "; } if ( !$MBExistComp ) { $MBExistComp = " "; } push @compRows, < $Backups[$i]{num} $ltype $is_compress $MBExist $MBExistComp $ExistComp $MBNew $MBNewComp $NewComp EOF push @errRows, < $Backups[$i]{num} $ltype $Lang->{XferLOG}, $Lang->{Errors} $Backups[$i]{xferErrs} $Backups[$i]{xferBadFile} $Backups[$i]{xferBadShare} $Backups[$i]{tarErrs} EOF } my $str = join("\n", reverse(@bkpRows)); my $sizeStr = join("\n", reverse(@sizeRows)); my $compStr = join("\n", reverse(@compRows)); my $errStr = join("\n", reverse(@errRows)); my $warnStr = join("\n", reverse(@warnRows)); my @Restores = $bpc->RestoreInfoRead($host); my @restoreRows; for ( my $i = 0 ; $i < @Restores ; $i++ ) { my $startTime = timeStamp2($Restores[$i]{startTime}); my $dur = $Restores[$i]{endTime} - $Restores[$i]{startTime}; $dur = 1 if ( $dur <= 0 ); my $duration = sprintf("%.1f", $dur / 60); my $MB = sprintf("%.1f", $Restores[$i]{size} / (1024 * 1024)); my $MBperSec = sprintf("%.2f", $Restores[$i]{size} / (1024 * 1024 * $dur)); my $Restores_Result = $Lang->{failed}; if ( $Restores[$i]{result} ne "failed" ) { $Restores_Result = $Lang->{success}; } push @restoreRows, <$Restores[$i]{num} $Restores_Result $startTime $duration $Restores[$i]{nFiles} $MB $Restores[$i]{tarCreateErrs} $Restores[$i]{xferErrs} EOF } my $restoreStr = join("\n", reverse(@restoreRows)); if ( $restoreStr ne "" ) { $restoreStr = eval("qq{$Lang->{Restore_Summary}}"); } if ( @Backups == 0 ) { $warnStr = $Lang->{This_PC_has_never_been_backed_up}; } if ( defined($Hosts->{$host}) ) { my $user = $Hosts->{$host}{user}; my @moreUsers = sort(keys(%{$Hosts->{$host}{moreUsers}})); my $moreUserStr; foreach my $u ( sort(keys(%{$Hosts->{$host}{moreUsers}})) ) { $moreUserStr .= ", " if ( $moreUserStr ne "" ); $moreUserStr .= "${UserLink($u)}"; } if ( $moreUserStr ne "" ) { $moreUserStr = " ($Lang->{and} $moreUserStr).\n"; } else { $moreUserStr = ".\n"; } if ( $user ne "" ) { $statusStr .= eval("qq{$Lang->{This_PC_is_used_by}$moreUserStr}"); } if ( defined($UserEmailInfo{$user}) && defined($UserEmailInfo{$user}{$host}) && defined($UserEmailInfo{$user}{$host}{lastSubj}) ) { my $mailTime = timeStamp2($UserEmailInfo{$user}{$host}{lastTime}); my $subj = $UserEmailInfo{$user}{$host}{lastSubj}; $statusStr .= eval("qq{$Lang->{Last_email_sent_to__was_at___subject}}"); } elsif ( defined($UserEmailInfo{$user}) && $UserEmailInfo{$user}{lastHost} eq $host && defined($UserEmailInfo{$user}{lastSubj}) ) { # # Old format %UserEmailInfo - pre 3.2.0. # my $mailTime = timeStamp2($UserEmailInfo{$user}{lastTime}); my $subj = $UserEmailInfo{$user}{lastSubj}; $statusStr .= eval("qq{$Lang->{Last_email_sent_to__was_at___subject}}"); } } if ( defined($StatusHost{Job}) ) { my $startTime = timeStamp2($StatusHost{Job}{startTime}); (my $cmd = $StatusHost{Job}{cmd}) =~ s/$BinDir\///g; $statusStr .= eval("qq{$Lang->{The_command_cmd_is_currently_running_for_started}}"); } if ( $StatusHost{BgQueueOn} ) { $statusStr .= eval("qq{$Lang->{Host_host_is_queued_on_the_background_queue_will_be_backed_up_soon}}"); } if ( $StatusHost{UserQueueOn} ) { $statusStr .= eval("qq{$Lang->{Host_host_is_queued_on_the_user_queue__will_be_backed_up_soon}}"); } if ( $StatusHost{CmdQueueOn} ) { $statusStr .= eval("qq{$Lang->{A_command_for_host_is_on_the_command_queue_will_run_soon}}"); } my $startTime = timeStamp2($StatusHost{endTime} == 0 ? $StatusHost{startTime} : $StatusHost{endTime}); my $reason = ""; if ( $StatusHost{reason} ne "" ) { $reason = " ($Lang->{$StatusHost{reason}})"; } $statusStr .= eval("qq{$Lang->{Last_status_is_state_StatusHost_state_reason_as_of_startTime}}"); if ( $StatusHost{state} ne "Status_backup_in_progress" && $StatusHost{state} ne "Status_restore_in_progress" && $StatusHost{error} ne "" ) { $statusStr .= eval("qq{$Lang->{Last_error_is____EscHTML_StatusHost_error}}"); } my $priorStr = "Pings"; if ( $StatusHost{deadCnt} > 0 ) { $statusStr .= eval("qq{$Lang->{Pings_to_host_have_failed_StatusHost_deadCnt__consecutive_times}}"); $priorStr = $Lang->{Prior_to_that__pings}; } if ( $StatusHost{aliveCnt} > 0 ) { $statusStr .= eval("qq{$Lang->{priorStr_to_host_have_succeeded_StatusHostaliveCnt_consecutive_times}}"); if ( (@{$Conf{BlackoutPeriods}} || defined($Conf{BlackoutHourBegin})) && $StatusHost{aliveCnt} >= $Conf{BlackoutGoodCnt} && $Conf{BlackoutGoodCnt} >= 0 ) { # # Handle backward compatibility with original separate scalar # blackout parameters. # if ( defined($Conf{BlackoutHourBegin}) ) { push( @{$Conf{BlackoutPeriods}}, { hourBegin => $Conf{BlackoutHourBegin}, hourEnd => $Conf{BlackoutHourEnd}, weekDays => $Conf{BlackoutWeekDays}, } ); } # # TODO: this string needs i18n. Also, comma-separated # list with "and" for the last element might not translate # correctly. # my(@days) = qw(Sun Mon Tue Wed Thu Fri Sat); my $blackoutStr; my $periodCnt = 0; foreach my $p ( @{$Conf{BlackoutPeriods}} ) { next if ( ref($p->{weekDays}) ne "ARRAY" || !defined($p->{hourBegin}) || !defined($p->{hourEnd}) ); my $days = join(", ", @days[@{$p->{weekDays}}]); my $t0 = sprintf("%d:%02d", $p->{hourBegin}, 60 * ($p->{hourBegin} - int($p->{hourBegin}))); my $t1 = sprintf("%d:%02d", $p->{hourEnd}, 60 * ($p->{hourEnd} - int($p->{hourEnd}))); if ( $periodCnt ) { $blackoutStr .= ", "; if ( $periodCnt == @{$Conf{BlackoutPeriods}} - 1 ) { $blackoutStr .= eval("qq{$Lang->{and}}"); $blackoutStr .= " "; } } $blackoutStr .= eval("qq{$Lang->{__time0_to__time1_on__days}}"); $periodCnt++; } $statusStr .= eval( "qq{$Lang->{Because__host_has_been_on_the_network_at_least__Conf_BlackoutGoodCnt_consecutive_times___}}" ); } } if ( $StatusHost{backoffTime} > time ) { my $hours = sprintf("%.1f", ($StatusHost{backoffTime} - time) / 3600); $statusStr .= eval("qq{$Lang->{Backups_are_deferred_for_hours_hours_change_this_number}}"); } if ( length($Conf{ClientComment}) ) { $statusStr .= "
  • ${EscHTML($Conf{ClientComment})}\n"; } if ( @Backups ) { # only allow incremental if there are already some backups $startIncrStr = < EOF } $startIncrStr = eval("qq{$startIncrStr}"); my $content = eval("qq{$Lang->{Host__host_Backup_Summary2}}"); Header(eval("qq{$Lang->{Host__host_Backup_Summary}}"), $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/EmailSummary.pm0000444000047500004750000000532113673511776017673 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::EmailSummary package # # DESCRIPTION # # This module implements the EmailSummary action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::EmailSummary; use strict; use BackupPC::CGI::Lib qw(:all); sub action { my $Privileged = CheckPermission(); if ( !$Privileged ) { ErrorExit($Lang->{Only_privileged_users_can_view_email_summaries}); } GetStatusInfo("hosts"); ReadUserEmailInfo(); my(%EmailStr, $str); foreach my $u ( keys(%UserEmailInfo) ) { my $info; if ( defined($UserEmailInfo{$u}{lastTime}) && ref($UserEmailInfo{$u}{lastTime}) ne 'HASH' ) { # # old format $UserEmailInfo - pre 3.2.0. # my $host = $UserEmailInfo{$u}{lastHost}; $info = { $host => { lastTime => $UserEmailInfo{$u}{lastTime}, lastSubj => $UserEmailInfo{$u}{lastSubj}, }, }; } else { $info = $UserEmailInfo{$u}; } foreach my $host ( keys(%$info) ) { next if ( !defined($info->{$host}{lastTime}) ); my $emailTimeStr = timeStamp2($info->{$host}{lastTime}); $EmailStr{$info->{$host}{lastTime}} .= <${UserLink($u)} ${HostLink($host)} $emailTimeStr $info->{$host}{lastSubj} EOF } } foreach my $t ( sort({ $b <=> $a } keys(%EmailStr)) ) { $str .= $EmailStr{$t}; } my $content = eval("qq{$Lang->{Recent_Email_Summary}}"); Header($Lang->{Email_Summary}, $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/Summary.pm0000444000047500004750000001523013673511776016723 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::Summary package # # DESCRIPTION # # This module implements the Summary action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::Summary; use strict; use BackupPC::CGI::Lib qw(:all); sub action { my($fullTot, $fullSizeTot, $incrTot, $incrSizeTot, $str, $strNone, $strGood, $hostCntGood, $hostCntNone); $hostCntGood = $hostCntNone = 0; GetStatusInfo("hosts info"); my $Privileged = CheckPermission(); foreach my $host ( GetUserHosts(1) ) { my( $fullDur, $incrCnt, $incrAge, $fullSize, $fullRate, $reasonHilite, $lastAge, $tempState, $tempReason, $lastXferErrors ); my($shortErr); my @Backups = $bpc->BackupInfoRead($host); my $fullCnt = $incrCnt = 0; my $fullAge = $incrAge = $lastAge = -1; $bpc->ConfigRead($host); %Conf = $bpc->Conf(); next if ( $Conf{XferMethod} eq "archive" ); next if ( !$Privileged && !CheckPermission($host) ); for ( my $i = 0 ; $i < @Backups ; $i++ ) { if ( $Backups[$i]{type} eq "full" ) { $fullCnt++; if ( $fullAge < 0 || $Backups[$i]{startTime} > $fullAge ) { $fullAge = $Backups[$i]{startTime}; $fullSize = $Backups[$i]{size} / (1024 * 1024); $fullDur = $Backups[$i]{endTime} - $Backups[$i]{startTime}; } $fullSizeTot += $Backups[$i]{size} / (1024 * 1024); } elsif ( $Backups[$i]{type} eq "incr" ) { $incrCnt++; if ( $incrAge < 0 || $Backups[$i]{startTime} > $incrAge ) { $incrAge = $Backups[$i]{startTime}; } $incrSizeTot += $Backups[$i]{size} / (1024 * 1024); } } if ( $fullAge > $incrAge && $fullAge >= 0 ) { $lastAge = $fullAge; } else { $lastAge = $incrAge; } if ( $lastAge < 0 ) { $lastAge = ""; } else { $lastAge = sprintf("%.1f", (time - $lastAge) / (24 * 3600)); } if ( $fullAge < 0 ) { $fullAge = ""; $fullRate = ""; } else { $fullAge = sprintf("%.1f", (time - $fullAge) / (24 * 3600)); $fullRate = sprintf("%.2f", $fullSize / ($fullDur <= 0 ? 1 : $fullDur)); } if ( $incrAge < 0 ) { $incrAge = ""; } else { $incrAge = sprintf("%.1f", (time - $incrAge) / (24 * 3600)); } $fullTot += $fullCnt; $incrTot += $incrCnt; $fullSize = sprintf("%.2f", $fullSize / 1024); $incrAge = " " if ( $incrAge eq "" ); $lastXferErrors = $Backups[@Backups - 1]{xferErrs} if ( @Backups ); $reasonHilite = $Conf{CgiStatusHilightColor}{$Status{$host}{reason}} || $Conf{CgiStatusHilightColor}{$Status{$host}{state}}; if ( $Conf{BackupsDisable} == 1 ) { if ( $Status{$host}{state} ne "Status_backup_in_progress" && $Status{$host}{state} ne "Status_restore_in_progress" ) { $reasonHilite = $Conf{CgiStatusHilightColor}{Disabled_OnlyManualBackups}; $tempState = "Disabled_OnlyManualBackups"; $tempReason = ""; } else { $tempState = $Status{$host}{state}; $tempReason = $Status{$host}{reason}; } } elsif ( $Conf{BackupsDisable} == 2 ) { $reasonHilite = $Conf{CgiStatusHilightColor}{Disabled_AllBackupsDisabled}; $tempState = "Disabled_AllBackupsDisabled"; $tempReason = ""; } else { $tempState = $Status{$host}{state}; $tempReason = $Status{$host}{reason}; } $reasonHilite = " bgcolor=\"$reasonHilite\"" if ( $reasonHilite ne "" ); if ( $tempState ne "Status_backup_in_progress" && $tempState ne "Status_restore_in_progress" && $Conf{BackupsDisable} == 0 && $Status{$host}{error} ne "" ) { ($shortErr = $Status{$host}{error}) =~ s/(.{48}).*/$1.../; $shortErr = " ($shortErr)"; } $str = <${HostLink($host)} ${UserLink(defined($Hosts->{$host}) ? $Hosts->{$host}{user} : "")} ${EscHTML($Conf{ClientComment})} $fullCnt $fullAge $fullSize $fullRate $incrCnt $incrAge $lastAge $Lang->{$tempState} $lastXferErrors $Lang->{$tempReason}$shortErr EOF if ( @Backups == 0 ) { $hostCntNone++; $strNone .= $str; } else { $hostCntGood++; $strGood .= $str; } } $fullSizeTot = sprintf("%.2f", $fullSizeTot / 1024); $incrSizeTot = sprintf("%.2f", $incrSizeTot / 1024); my $now = timeStamp2(time); my $DUlastTime = timeStamp2($Info{DUlastValueTime}); my $DUmaxTime = timeStamp2($Info{DUDailyMaxTime}); my $DUInodemaxTime = timeStamp2($Info{DUInodeDailyMaxTime}); my $content = eval("qq{$Lang->{BackupPC_Summary}}"); Header($Lang->{BackupPC__Server_Summary}, $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/GeneralInfo.pm0000444000047500004750000001457513673511776017472 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::GeneralInfo package # # DESCRIPTION # # This module implements the GeneralInfo action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2001-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::GeneralInfo; use strict; use BackupPC::CGI::Lib qw(:all); sub action { GetStatusInfo("info jobs hosts queueLen"); my $Privileged = CheckPermission(); my($jobStr, $statusStr); foreach my $host ( sort(keys(%Jobs)) ) { my $startTime = timeStamp2($Jobs{$host}{startTime}); next if ( $host eq $bpc->scgiJob ); next if ( !$Privileged && !CheckPermission($host) ); $Jobs{$host}{type} = $Status{$host}{type} if ( $Jobs{$host}{type} eq "" && defined($Status{$host}) ); (my $cmd = $Jobs{$host}{cmd}) =~ s/$BinDir\///g; (my $xferPid = $Jobs{$host}{xferPid}) =~ s/,/, /g; $jobStr .= < ${HostLink($host)} $Jobs{$host}{type} ${UserLink(defined($Hosts->{$host}) ? $Hosts->{$host}{user} : "")} $startTime $cmd $Jobs{$host}{pid} $xferPid $Jobs{$host}{xferState} $Jobs{$host}{xferFileCnt} EOF $jobStr .= "\n"; } foreach my $host ( sort(keys(%Status)) ) { next if ( $Status{$host}{reason} ne "Reason_backup_failed" && $Status{$host}{reason} ne "Reason_restore_failed" && ( !$Status{$host}{userReq} || $Status{$host}{reason} ne "Reason_no_ping") ); next if ( !$Privileged && !CheckPermission($host) ); my $startTime = timeStamp2($Status{$host}{startTime}); my($errorTime, $XferViewStr); if ( $Status{$host}{errorTime} > 0 ) { $errorTime = timeStamp2($Status{$host}{errorTime}); } if ( -f "$TopDir/pc/$host/SmbLOG.bad" || -f "$TopDir/pc/$host/SmbLOG.bad.z" || -f "$TopDir/pc/$host/XferLOG.bad" || -f "$TopDir/pc/$host/XferLOG.bad.z" ) { $XferViewStr = <$Lang->{XferLOG}, $Lang->{Errors} EOF } else { $XferViewStr = ""; } (my $shortErr = $Status{$host}{error}) =~ s/(.{48}).*/$1.../; $statusStr .= < ${HostLink($host)} $Status{$host}{type} ${UserLink(defined($Hosts->{$host}) ? $Hosts->{$host}{user} : "")} $startTime $XferViewStr $errorTime ${EscHTML($shortErr)} EOF } my $now = timeStamp2(time); my $nextWakeupTime = timeStamp2($Info{nextWakeup}); my $DUlastTime = timeStamp2($Info{DUlastValueTime}); my $DUmaxTime = timeStamp2($Info{DUDailyMaxTime}); my $DUInodemaxTime = timeStamp2($Info{DUInodeDailyMaxTime}); my $numBgQueue = $QueueLen{BgQueue}; my $numUserQueue = $QueueLen{UserQueue}; my $numCmdQueue = $QueueLen{CmdQueue}; my $serverStartTime = timeStamp2($Info{startTime}); my $configLoadTime = timeStamp2($Info{ConfigLTime}); my $poolInfo = genPoolInfo("pool4", "pool", \%Info); my $cpoolInfo = genPoolInfo("cpool4", "cpool", \%Info); if ( $Info{pool4FileCnt} > 0 && $Info{cpool4FileCnt} > 0 ) { $poolInfo = <Uncompressed pool:
      $poolInfo
  • Compressed pool:
      $cpoolInfo
    EOF } elsif ( $Info{cpool4FileCnt} > 0 ) { $poolInfo = $cpoolInfo; } my $generalInfo = ""; if ( $Privileged ) { $generalInfo = eval("qq{$Lang->{BackupPC_Server_Status_General_Info}}"); if ( -r "$LogDir/poolUsage4.png" && -r "$LogDir/poolUsage52.png" ) { $generalInfo .= <

    EOF } } my $content = eval("qq{$Lang->{BackupPC_Server_Status}}"); Header($Lang->{H_BackupPC_Server_Status}, $content); Trailer(); } sub genPoolInfo { my($name, $name3, $info) = @_; my $poolSize = sprintf("%.2f", $info->{"${name}Kb"} / (1024 * 1024)); my $poolRmSize = sprintf("%.2f", $info->{"${name}KbRm"} / (1024 * 1024)); my $poolTime = timeStamp2($info->{"${name}Time"}); $info->{"${name}FileCntRm"} = $info->{"${name}FileCntRm"} + 0; if ( $Conf{PoolV3Enabled} ) { $poolSize .= sprintf("+%.2f", $info->{"${name3}Kb"} / (1024 * 1024)); $poolRmSize .= sprintf("+%.2f", $info->{"${name3}KbRm"} / (1024 * 1024)); foreach my $stat ( qw(DirCnt FileCnt FileCntRep FileRepMax FileCntRm) ) { $Info{"$name$stat"} = $Info{"$name$stat"} . "+" . $Info{"$name3$stat"}; } } return eval("qq{$Lang->{Pool_Stat}}"); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/StartServer.pm0000444000047500004750000000375613673511776017564 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::StartServer package # # DESCRIPTION # # This module implements the StartServer action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::StartServer; use strict; use BackupPC::CGI::Lib qw(:all); sub action { if ( -f $Conf{ServerInitdPath} && $bpc->{Conf}{ServerInitdStartCmd} ne "" && !$bpc->ServerOK() ) { my $args = { serverInitdPath => $bpc->{Conf}{ServerInitdPath}, sshPath => $bpc->{Conf}{SshPath}, serverHost => $bpc->{Conf}{ServerHost}, }; my $serverInitdStartCmd = $bpc->cmdVarSubstitute($bpc->{Conf}{ServerInitdStartCmd}, $args); $bpc->cmdSystemOrEval($serverInitdStartCmd, undef, $args); for ( my $i = 0 ; $i < 10 ; $i++ ) { last unless ( $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}) ); sleep(1); } $bpc->ServerDisconnect(); } print $Cgi->redirect($MyURL); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/AdminOptions.pm0000444000047500004750000000304113673511776017667 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::AdminOptions package # # DESCRIPTION # # This module implements the AdminOptions action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::AdminOptions; use strict; use BackupPC::CGI::Lib qw(:all); sub action { unless ( CheckPermission() ) { ErrorExit($Lang->{Only_privileged_users_can_view_admin_options}); } my $content = eval("qq{$Lang->{Admin_Options_Page}}"); Header(eval("qq{$Lang->{H_Admin_Options}}"), $content); Trailer(); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/RestoreFile.pm0000444000047500004750000001700613673511776017514 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::RestoreFile package # # DESCRIPTION # # This module implements the RestoreFile action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::RestoreFile; use strict; use BackupPC::CGI::Lib qw(:all); use BackupPC::XS qw(:all); use BackupPC::View; use Encode qw/from_to decode_utf8/; sub action { my $num = $In{num}; my $share = $In{share}; my $dir = $In{dir}; ErrorExit(eval("qq{$Lang->{Invalid_number__num}}")) if ( $num ne "" && $num !~ /^\d+$/ ); ErrorExit($Lang->{Nice_try__but_you_can_t_put}) if ( $dir =~ m{(^|/)\.\.(/|$)} ); restoreFile($In{host}, $num, $share, $dir); } sub restoreFile { my($host, $num, $share, $dir, $skipHardLink, $origName) = @_; my($Privileged) = CheckPermission($host); # # Some common content (media) types from www.iana.org (via MIME::Types). # my $Ext2ContentType = { 'asc' => 'text/plain', 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'book' => 'application/x-maker', 'cc' => 'text/plain', 'cpp' => 'text/plain', 'csh' => 'application/x-csh', 'csv' => 'text/comma-separated-values', 'c' => 'text/plain', 'deb' => 'application/x-debian-package', 'doc' => 'application/msword', 'dot' => 'application/msword', 'dtd' => 'text/xml', 'dvi' => 'application/x-dvi', 'eps' => 'application/postscript', 'fb' => 'application/x-maker', 'fbdoc' => 'application/x-maker', 'fm' => 'application/x-maker', 'frame' => 'application/x-maker', 'frm' => 'application/x-maker', 'gif' => 'image/gif', 'gtar' => 'application/x-gtar', 'gz' => 'application/x-gzip', 'hh' => 'text/plain', 'hpp' => 'text/plain', 'h' => 'text/plain', 'html' => 'text/html', 'htmlx' => 'text/html', 'htm' => 'text/html', 'iges' => 'model/iges', 'igs' => 'model/iges', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'application/x-javascript', 'latex' => 'application/x-latex', 'maker' => 'application/x-maker', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'movie' => 'video/x-sgi-movie', 'mov' => 'video/quicktime', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpp' => 'application/vnd.ms-project', 'pdf' => 'application/pdf', 'pgp' => 'application/pgp-signature', 'php' => 'application/x-httpd-php', 'pht' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', 'png' => 'image/png', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/powerpoint', 'ppt' => 'application/vnd.ms-powerpoint', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'rgb' => 'image/x-rgb', 'rtf' => 'application/rtf', 'rtf' => 'text/rtf', 'shar' => 'application/x-shar', 'shtml' => 'text/html', 'swf' => 'application/x-shockwave-flash', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'tgz' => 'application/x-gtar', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'txt' => 'text/plain', 'vcf' => 'text/x-vCard', 'vrml' => 'model/vrml', 'wav' => 'audio/x-wav', 'wmls' => 'text/vnd.wap.wmlscript', 'wml' => 'text/vnd.wap.wml', 'wrl' => 'model/vrml', 'xls' => 'application/vnd.ms-excel', 'xml' => 'text/xml', 'xwd' => 'image/x-xwindowdump', 'z' => 'application/x-compress', 'zip' => 'application/zip', %{$Conf{CgiExt2ContentType}}, # add site-specific values }; if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_restore_backup_files2}}")); } $bpc->ConfigRead($host); %Conf = $bpc->Conf(); ServerConnect(); ErrorExit($Lang->{Empty_host_name}) if ( $host eq "" ); $dir = "/" if ( $dir eq "" ); my @Backups = $bpc->BackupInfoRead($host); my $view = BackupPC::View->new($bpc, $host, \@Backups); my $a = $view->fileAttrib($num, $share, $dir); if ( $dir =~ m{(^|/)\.\.(/|$)} || !defined($a) ) { $dir = decode_utf8($dir); ErrorExit("Can't restore bad file ${EscHTML($dir)} (${EscHTML($num)}, ${EscHTML($share)})"); } my $f = BackupPC::XS::FileZIO::open($a->{fullPath}, 0, $a->{compress}); if ( !defined($f) ) { my $fullPath = decode_utf8($a->{fullPath}); ErrorExit("Unable to open file ${EscHTML($fullPath)} (${EscHTML($num)}, ${EscHTML($share)})"); } my $data; if ( !$skipHardLink && $a->{type} == BPC_FTYPE_HARDLINK ) { # # hardlinks should look like the file they point to # my $linkName; while ( $f->read(\$data, 65536) > 0 ) { $linkName .= $data; } $f->close; $linkName =~ s/^\.\///; restoreFile($host, $num, $share, $linkName, 1, $dir); return; } $bpc->ServerMesg("log User $User recovered file $host/$num:$share/$dir ($a->{fullPath})"); $dir = $origName if ( defined($origName) ); my $ext = $1 if ( $dir =~ /\.([^\/\.]+)$/ ); my $contentType = $Ext2ContentType->{lc($ext)} || "application/octet-stream"; my $fileName = $1 if ( $dir =~ /.*\/(.*)/ ); $fileName =~ s/"/\\"/g; print "Content-Type: $contentType\r\n"; print "Content-Transfer-Encoding: binary\r\n"; if ( $ENV{HTTP_USER_AGENT} =~ /\bmsie\b/i && $ENV{HTTP_USER_AGENT} !~ /\bopera\b/i ) { # # Convert to cp1252 for MS IE. TODO: find a way to get IE # to accept UTF8 encoding. Firefox accepts inline encoding # using the "=?UTF-8?B?base64?=" format, but IE doesn't. # from_to($fileName, "utf8", "cp1252") if ( $Conf{ClientCharset} ne "" ); } print "Content-Disposition: attachment; filename=\"$fileName\"\r\n\r\n"; while ( $f->read(\$data, 1024 * 1024) > 0 ) { print $data; } $f->close; } 1; BackupPC-4.4.0/lib/BackupPC/CGI/Metrics.pm0000444000047500004750000003044513673511776016701 0ustar craigcraig#============================================================= # # BackupPC::CGI::Metrics package # # DESCRIPTION # # This module implements a metrics page for the CGI interface. # # AUTHOR # Jonas L. # # COPYRIGHT # Copyright (C) 2005-2013 Jonas L., Rich Duzenbury and Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::Metrics; use strict; use warnings; use BackupPC::CGI::Lib qw(:all); my $LoadErrorXMLRSS; my $LoadErrorJSONXS; BEGIN { eval "use XML::RSS;"; $LoadErrorXMLRSS = $@ if $@; eval "use JSON::XS;"; $LoadErrorJSONXS = $@ if $@; } sub action { GetStatusInfo("info hosts queueLen"); my $Privileged = CheckPermission(); my %metrics; # # Global metrics # $metrics{server} = { hostname => $Conf{ServerHost}, pid => $Info{pid}, version => $Info{Version}, start_time => $Info{startTime}, config_time => $Info{ConfigLTime}, next_wakeup_time => $Info{nextWakeup}, }; $metrics{disk} = { usage => $Info{DUlastValue}, inode_usage => $Info{DUInodelastValue}, }; $metrics{queues} = { background_count => $QueueLen{BgQueue}, command_count => $QueueLen{CmdQueue}, user_count => $QueueLen{UserQueue}, }; my %poolMapper = ( dir_count => "DirCnt", file_count => "FileCnt", remove_file_count => "FileCntRm", remove_size => "KbRm", repeated_file_count => "FileCntRep", repeated_file_max => "FileRepMax", size => "Kb", ); sub generatePool { my($name) = @_; my %pool = (time => $Info{"${name}Time"}); foreach my $key ( keys %poolMapper ) { $pool{$key} = $Info{"${name}4$poolMapper{$key}"}; } if ( $Conf{PoolV3Enabled} ) { foreach my $key ( keys %poolMapper ) { $pool{$key} .= $Info{"${name}$poolMapper{$key}"}; } } return \%pool; } $metrics{pool} = $Info{pool4FileCnt} > 0 ? generatePool("pool") : undef; $metrics{cpool} = $Info{cpool4FileCnt} > 0 ? generatePool("cpool") : undef; # # Host metrics # foreach my $host ( GetUserHosts(1) ) { my($fullAge, $fullCount, $fullDuration, $fullRate, $fullSize, $incrAge, $incrCount, $incrDuration); $fullCount = $incrCount = 0; $fullAge = $incrAge = -1; my @Backups = $bpc->BackupInfoRead($host); $bpc->ConfigRead($host); %Conf = $bpc->Conf(); next if ( $Conf{XferMethod} eq "archive" ); next if ( !$Privileged && !CheckPermission($host) ); for ( my $i = 0 ; $i < @Backups ; $i++ ) { if ( $Backups[$i]{type} eq "full" ) { $fullCount++; if ( $fullAge < 0 || $Backups[$i]{startTime} > $fullAge ) { $fullAge = $Backups[$i]{startTime}; $fullDuration = $Backups[$i]{endTime} - $Backups[$i]{startTime}; $fullSize = $Backups[$i]{size}; } } elsif ( $Backups[$i]{type} eq "incr" ) { $incrCount++; if ( $incrAge < 0 || $Backups[$i]{startTime} > $incrAge ) { $incrAge = $Backups[$i]{startTime}; $incrDuration = $Backups[$i]{endTime} - $Backups[$i]{startTime}; } } } if ( $fullAge > 0 ) { $fullRate = $fullSize / ($fullDuration <= 0 ? 1 : $fullDuration); } $metrics{hosts}{$host} = { full_age => int($fullAge), full_count => $fullCount, full_duration => $fullDuration, full_keep_count => $Conf{FullKeepCnt}, full_period => $Conf{FullPeriod}, full_rate => int($fullRate), full_size => int($fullSize), incr_age => int($incrAge), incr_count => $incrCount, incr_duration => $incrDuration, incr_keep_count => $Conf{IncrKeepCnt}, incr_period => $Conf{IncrPeriod}, error => $Status{$host}{error}, reason => $Status{$host}{reason}, state => $Status{$host}{state}, disabled => $Conf{BackupsDisable}, }; } # # Format and print metrics # binmode(STDOUT, ":utf8"); my($content, $contentType, $format); # Check if action is RSS, if not find out metrics format. # Allowed formats are the following: json (default), rss, prometheus $format = $In{action} eq "rss" ? "rss" : $In{format}; if ( $format eq "rss" ) { if ( $LoadErrorXMLRSS ) { print "Status: 500 Internal Server Error\n"; print "Content-type: text/plain\n\n"; print $LoadErrorXMLRSS; return; } $contentType = "text/xml"; my $rss = new XML::RSS( version => '0.91', encoding => 'utf-8' ); my $baseURL = $ENV{HTTPS} eq "on" ? 'https://' : 'http://' . $ENV{'SERVER_NAME'} . $ENV{SCRIPT_NAME}; $rss->channel( title => eval("qq{$Lang->{RSS_Doc_Title}}"), link => $baseURL, language => $Conf{Language}, description => eval("qq{$Lang->{RSS_Doc_Description}}"), ); foreach my $host ( sort keys %{$metrics{hosts}} ) { my( $fullCnt, $fullAge, $fullSize, $fullRate, $incrCnt, $incrAge, $hostState, $hostDisabled, $hostLastAttempt ); $fullCnt = $metrics{hosts}{$host}{full_count}; $fullAge = sprintf("%.1f", (time - $metrics{hosts}{$host}{full_timestamp}) / (24 * 3600)); $fullSize = sprintf("%.2f", $metrics{hosts}{$host}{full_size} / (1024**3)); $fullRate = sprintf("%.2f", $metrics{hosts}{$host}{full_rate} / (1024**2)); $incrCnt = $metrics{hosts}{$host}{incr_count}; $incrAge = sprintf("%.1f", (time - $metrics{hosts}{$host}{incr_timestamp}) / (24 * 3600)); my $error; if ( $metrics{hosts}{$host}{state} ne "Status_backup_in_progress" and $metrics{hosts}{$host}{state} ne "Status_restore_in_progress" and $metrics{hosts}{$host}{error} ne "" ) { ($error = $metrics{hosts}{$host}{error}) =~ s/(.{48}).*/$1.../; $error = " ($error)"; } my $hostState = $Lang->{$metrics{hosts}{$host}{state}}; my $hostLastAttempt = $Lang->{$metrics{hosts}{$host}{reason}} . $error; my $hostDisabled = $metrics{hosts}{$host}{disabled}; my $description = eval("qq{$Lang->{RSS_Host_Summary}}"); $rss->add_item( title => "$host, $hostState, $hostLastAttempt", link => "$baseURL?host=$host", description => $description, ); } $content = $rss->as_string; } elsif ( $format eq "prometheus" ) { $contentType = "text/plain"; my %mapper = ( hosts => { full_age => {desc => "Age of the last full backup"}, full_count => {desc => "Number of full backups"}, full_duration => {desc => "Transfert time in seconds of the last full backup"}, full_keep_count => {desc => "Number of full backups to keep"}, full_period => {desc => "Minimum period in days between full backups"}, full_rate => {desc => "Transfert rate in bytes/s of the last full backup"}, full_size => {desc => "Size in bytes of the last full backup"}, incr_age => {desc => "Age of the last incremental backup"}, incr_count => {desc => "Number of incremental backups"}, incr_duration => {desc => "Transfert time in seconds of the last incremental backup"}, incr_keep_count => {desc => "Number of incremental backups to keep"}, incr_period => {desc => "Minimum period in days between incremental backups"}, disabled => {desc => "Backups disabled"}, error => {kind => "label", desc => "Host error"}, reason => {kind => "label", desc => "Host state reason"}, state => {kind => "label", desc => "Host state"}, }, disk => { usage => {desc => "Disk usage in %"}, inode_usage => {desc => "Disk inode usage in %"}, }, queues => { background_count => {desc => "Number of jobs in the background queue"}, command_count => {desc => "Number of jobs in the command queue"}, user_count => {desc => "Number of jobs in the user queue"}, }, pool => { dir_count => {desc => "Number of directories in the pool"}, file_count => {desc => "Number of files in the pool"}, remove_file_count => {desc => "Number of files to remove in the pool"}, remove_size => {desc => " Size in bytes to remove from the pool"}, size => {desc => "Size in bytes of the pool"}, }, cpool => { dir_count => {desc => "Number of directories in the pool"}, file_count => {desc => "Number of files in the pool"}, remove_file_count => {desc => "Number of files to remove in the pool"}, remove_size => {desc => " Size in bytes to remove from the pool"}, size => {desc => "Size in bytes of the pool"}, }, ); foreach my $section ( sort keys %mapper ) { foreach my $entry ( sort keys %{$mapper{$section}} ) { # Ignore empty pools next if ( ($section eq "pool" or $section eq "cpool") and $metrics{$section}{file_count} <= 0 ); my $promKey = "backuppc_${section}_${entry}"; # Generate prometheus header $content .= "# HELP $promKey $mapper{$section}{$entry}{desc}\n"; $content .= "# TYPE $promKey gauge\n"; if ( $section eq "hosts" ) { foreach my $host ( sort keys %{$metrics{hosts}} ) { if ( $mapper{hosts}{$entry}{kind} eq 'label' ) { if ( $metrics{hosts}{$host}{$entry} ) { $content .= "${promKey}\{host=\"$host\",label=\"$metrics{hosts}{$host}{$entry}\"\} 1\n"; } } else { $content .= "${promKey}\{host=\"$host\"\} $metrics{hosts}{$host}{$entry}\n"; } } } else { $content .= "$promKey $metrics{$section}{$entry}\n"; } $content .= "\n"; } } } else { if ( $LoadErrorJSONXS ) { print "Status: 500 Internal Server Error\n"; print "Content-type: text/plain\n\n"; print $LoadErrorJSONXS; return; } $contentType = "application/json"; $content = encode_json(\%metrics); } print "Content-type: $contentType\n\n"; print $content; } 1; BackupPC-4.4.0/lib/BackupPC/CGI/StartStopBackup.pm0000444000047500004750000000712713673511776020365 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::StartStopBackup package # # DESCRIPTION # # This module implements the StartStopBackup action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::StartStopBackup; use strict; use BackupPC::CGI::Lib qw(:all); sub action { my($str, $reply); my $start = 1 if ( $In{action} eq "Start_Incr_Backup" || $In{action} eq "Start_Full_Backup" ); my $doFull = $In{action} eq "Start_Full_Backup" ? 1 : 0; my $type = $doFull ? $Lang->{Type_full} : $Lang->{Type_incr}; my $host = $In{host}; my $Privileged = CheckPermission($host); if ( !$Privileged ) { ErrorExit(eval("qq{$Lang->{Only_privileged_users_can_stop_or_start_backups}}")); } ServerConnect(); if ( $In{doit} ) { if ( $start ) { if ( $Hosts->{$host}{dhcp} ) { $reply = $bpc->ServerMesg("backup $In{hostIP} ${EscURI($host)} $User $doFull"); $str = eval("qq{$Lang->{Backup_requested_on_DHCP__host}}"); } else { $reply = $bpc->ServerMesg("backup ${EscURI($host)} ${EscURI($host)} $User $doFull"); $str = eval("qq{$Lang->{Backup_requested_on__host_by__User}}"); } } else { $reply = $bpc->ServerMesg("stop ${EscURI($host)} $User $In{backoff}"); $str = eval("qq{$Lang->{Backup_stopped_dequeued_on__host_by__User}}"); } my $content = eval("qq{$Lang->{REPLY_FROM_SERVER}}"); Header(eval("qq{$Lang->{BackupPC__Backup_Requested_on__host}}"), $content); Trailer(); } else { if ( $start ) { $bpc->ConfigRead($host); %Conf = $bpc->Conf(); my $checkHost = $host; $checkHost = $Conf{ClientNameAlias} if ( $Conf{ClientNameAlias} ne "" ); my $ipAddr = ConfirmIPAddress($checkHost); my $buttonText = $Lang->{$In{action}}; my $content = eval("qq{$Lang->{Are_you_sure_start}}"); Header(eval("qq{$Lang->{BackupPC__Start_Backup_Confirm_on__host}}"), $content); } else { my $backoff = ""; GetStatusInfo("host(${EscURI($host)})"); if ( $StatusHost{backoffTime} > time ) { $backoff = sprintf("%.1f", ($StatusHost{backoffTime} - time) / 3600); } my $buttonText = $Lang->{$In{action}}; my $content = eval("qq{$Lang->{Are_you_sure_stop}}"); Header(eval("qq{$Lang->{BackupPC__Stop_Backup_Confirm_on__host}}"), $content); } Trailer(); } } 1; BackupPC-4.4.0/lib/BackupPC/CGI/ReloadServer.pm0000444000047500004750000000272413673511776017667 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::ReloadServer package # # DESCRIPTION # # This module implements the ReloadServer action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::ReloadServer; use strict; use BackupPC::CGI::Lib qw(:all); sub action { ServerConnect(); $bpc->ServerMesg("log User $User requested server configuration reload"); $bpc->ServerMesg("server reload"); print $Cgi->redirect($MyURL); } 1; BackupPC-4.4.0/lib/BackupPC/CGI/LOGlist.pm0000444000047500004750000000557113673511776016612 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::LOGlist package # # DESCRIPTION # # This module implements the LOGlist action for the CGI interface. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::LOGlist; use strict; use BackupPC::CGI::Lib qw(:all); sub action { my $Privileged = CheckPermission($In{host}); if ( !$Privileged ) { ErrorExit($Lang->{Only_privileged_users_can_view_log_files}); } my $host = $In{host}; my($url0, $hdr, @files, $str); if ( $host ne "" ) { $url0 = "&host=${EscURI($host)}"; $hdr = "for host $host"; } else { $url0 = ""; $hdr = ""; } foreach my $file ( $bpc->sortedPCLogFiles($host) ) { my $url1 = "&num=$1" if ( $file =~ /LOG\.(\d+)(\.z)?$/ ); $url1 = "&num=" if ( $file =~ /LOG(\.z)?$/ ); next if ( !-f $file ); my $mtimeStr = $bpc->timeStamp((stat($file))[9], 1); my $size = (stat($file))[7]; (my $fStr = $file) =~ s{.*/}{}; $str .= < $fStr $size $mtimeStr EOF } my $content = eval("qq{$Lang->{Log_File_History__hdr}}"); Header($Lang->{BackupPC__Log_File_History}, $content, !-f "$TopDir/pc/$host/backups"); Trailer(); } sub compareLOGName { #my($a, $b) = @_; my $na = $1 if ( $a =~ /LOG\.(\d+)/ ); my $nb = $1 if ( $b =~ /LOG\.(\d+)/ ); if ( length($na) >= 5 && length($nb) >= 5 ) { # # Both new style. Bigger numbers are more recent. # return $nb <=> $na; } elsif ( length($na) >= 5 && length($nb) < 5 ) { return -1; } elsif ( length($na) < 5 && length($nb) >= 5 ) { return 1; } else { # # Both old style. Smaller numbers are more recent. # return $na - $nb; } } 1; BackupPC-4.4.0/lib/BackupPC/CGI/Lib.pm0000444000047500004750000004561313673511776016004 0ustar craigcraig#============================================================= -*-perl-*- # # BackupPC::CGI::Lib package # # DESCRIPTION # # This library defines a BackupPC::Lib class and a variety of utility # functions used by BackupPC. # # AUTHOR # Craig Barratt # # COPYRIGHT # Copyright (C) 2003-2020 Craig Barratt # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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, see . # #======================================================================== # # Version 4.4.0, released 20 Jun 2020. # # See http://backuppc.sourceforge.net. # #======================================================================== package BackupPC::CGI::Lib; use strict; use BackupPC::Lib; require Exporter; use vars qw( @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS ); use vars qw($Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc); use vars qw(%Status %Info %Jobs @BgQueue @UserQueue @CmdQueue %QueueLen %StatusHost); use vars qw($Hosts $HostsMTime $ConfigMTime $PrivAdmin); use vars qw(%UserEmailInfo $UserEmailInfoMTime %RestoreReq %ArchiveReq); use vars qw($Lang); @ISA = qw(Exporter); @EXPORT = qw( ); @EXPORT_OK = qw( timeStamp2 HostLink UserLink EscHTML EscURI ErrorExit ServerConnect GetStatusInfo ReadUserEmailInfo CheckPermission GetUserHosts ConfirmIPAddress Header Trailer NavSectionTitle NavSectionStart NavSectionEnd NavLink h1 h2 $Cgi %In $MyURL $User %Conf $TopDir $LogDir $BinDir $bpc %Status %Info %Jobs @BgQueue @UserQueue @CmdQueue %QueueLen %StatusHost $Hosts $HostsMTime $ConfigMTime $PrivAdmin %UserEmailInfo $UserEmailInfoMTime %RestoreReq %ArchiveReq $Lang ); %EXPORT_TAGS = ('all' => [@EXPORT_OK]); sub NewRequest { $Cgi = new CGI; %In = $Cgi->Vars; if ( !defined($bpc) ) { ErrorExit($Lang->{BackupPC__Lib__new_failed__check_apache_error_log}) if ( !($bpc = BackupPC::Lib->new(undef, undef, undef, 1)) ); $TopDir = $bpc->TopDir(); $LogDir = $bpc->LogDir(); $BinDir = $bpc->BinDir(); %Conf = $bpc->Conf(); $Lang = $bpc->Lang(); $ConfigMTime = $bpc->ConfigMTime(); umask($Conf{UmaskMode}); } elsif ( $bpc->ConfigMTime() != $ConfigMTime ) { $bpc->ConfigRead(); $TopDir = $bpc->TopDir(); $LogDir = $bpc->LogDir(); $BinDir = $bpc->BinDir(); %Conf = $bpc->Conf(); $Lang = $bpc->Lang(); $ConfigMTime = $bpc->ConfigMTime(); umask($Conf{UmaskMode}); } # # Default REMOTE_USER so in a miminal installation the user # has a sensible default. # $ENV{REMOTE_USER} = $Conf{BackupPCUser} if ( $ENV{REMOTE_USER} eq "" ); # # We require that Apache pass in $ENV{SCRIPT_NAME} and $ENV{REMOTE_USER}. # The latter requires .ht_access style authentication. Replace this # code if you are using some other type of authentication, and have # a different way of getting the user name. # $MyURL = $ENV{SCRIPT_NAME}; $User = $ENV{REMOTE_USER}; # # Handle LDAP uid=user when using mod_authz_ldap and otherwise untaint # $User = $1 if ( $User =~ /uid=([^,]+)/i || $User =~ /(.*)/ ); # # Clean up %ENV for taint checking # delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; $ENV{PATH} = $Conf{MyPath}; # # Verify we are running as the correct user # if ( $Conf{BackupPCUserVerify} && $> != (my $uid = getpwnam($Conf{BackupPCUser})) ) { ErrorExit(eval("qq{$Lang->{Wrong_user__my_userid_is___}}"), < This is an installation problem. If you are using mod_perl then it appears that Apache is not running as user $Conf{BackupPCUser}. If you are not using mod_perl, then most like setuid is not working properly on BackupPC_Admin. Check the permissions on $Conf{CgiDir}/BackupPC_Admin and look at the documentation. EOF } if ( !defined($Hosts) || $bpc->HostsMTime() != $HostsMTime ) { $HostsMTime = $bpc->HostsMTime(); $Hosts = $bpc->HostInfoRead(); # turn moreUsers list into a hash for quick lookups foreach my $host ( keys %$Hosts ) { $Hosts->{$host}{moreUsers} = {map { $_, 1 } split(",", $Hosts->{$host}{moreUsers})}; } } # # Untaint the host name # if ( $In{host} =~ /^([\w.\s-]+)$/ ) { $In{host} = $1; } else { delete($In{host}); } } sub timeStamp2 { my $now = $_[0] == 0 ? time : $_[0]; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($now); $mon++; if ( $Conf{CgiDateFormatMMDD} == 2 ) { $year += 1900; return sprintf("%04d-%02d-%02d %02d:%02d", $year, $mon, $mday, $hour, $min); } elsif ( $Conf{CgiDateFormatMMDD} ) { # # Add the year if the time is more than 330 days ago # if ( time - $now > 330 * 24 * 3600 ) { $year -= 100; return sprintf("$mon/$mday/%02d %02d:%02d", $year, $hour, $min); } else { return sprintf("$mon/$mday %02d:%02d", $hour, $min); } } else { # # Add the year if the time is more than 330 days ago # if ( time - $now > 330 * 24 * 3600 ) { $year -= 100; return sprintf("$mday/$mon/%02d %02d:%02d", $year, $hour, $min); } else { return sprintf("$mday/$mon %02d:%02d", $hour, $min); } } } sub HostLink { my($host) = @_; my($s); if ( defined($Hosts->{$host}) ) { $s = "$host"; } else { $s = $host; } return \$s; } sub UserLink { my($user) = @_; my($s); return \$user if ( $user eq "" || $Conf{CgiUserUrlCreate} eq "" ); if ( $Conf{CgiUserHomePageCheck} eq "" || -f sprintf($Conf{CgiUserHomePageCheck}, $user, $user, $user) ) { $s = "$user"; } else { $s = $user; } return \$s; } sub EscHTML { my($s) = @_; $s =~ s/&/&/g; $s =~ s/\"/"/g; $s =~ s/>/>/g; $s =~ s/\n

    ", @mesg); if ( !defined($ENV{REMOTE_USER}) ) { $mesg .= < Note: \$ENV{REMOTE_USER} is not set, which could mean there is an installation problem. BackupPC_Admin expects Apache to authenticate the user and pass their user name into this script as the REMOTE_USER environment variable. See the documentation. EOF } $bpc->ServerMesg("log User $User (host=$In{host}) got CGI error: $head") if ( defined($bpc) ); if ( !defined($Lang->{Error}) ) { $mesg = <$mesg

    EOF Header("BackupPC: Error", $content); Trailer(); } else { my $content = eval("qq{$Lang->{Error____head}}"); Header(eval("qq{$Lang->{Error}}"), $content); Trailer(); } exit(1); } sub ServerConnect { # # Verify that the server connection is ok # return if ( $bpc->ServerOK() ); $bpc->ServerDisconnect(); if ( my $err = $bpc->ServerConnect($Conf{ServerHost}, $Conf{ServerPort}) ) { if ( CheckPermission() && -f $Conf{ServerInitdPath} && $Conf{ServerInitdStartCmd} ne "" ) { my $content = eval("qq{$Lang->{Admin_Start_Server}}"); Header(eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"), $content); Trailer(); exit(1); } else { ErrorExit( eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server}}"), eval("qq{$Lang->{Unable_to_connect_to_BackupPC_server_error_message}}") ); } } } sub GetStatusInfo { my($status) = @_; ServerConnect(); %Status = () if ( $status =~ /\bhosts\b/ ); %StatusHost = () if ( $status =~ /\bhost\(/ ); my $reply = $bpc->ServerMesg("status $status"); $reply = $1 if ( $reply =~ /(.*)/s ); eval($reply); # ignore status related to admin jobs if ( $status =~ /\bhosts\b/ ) { foreach my $host ( grep(/admin/, keys(%Status)) ) { delete($Status{$host}) if ( $bpc->isAdminJob($host) ); } delete($Status{$bpc->scgiJob}); } } sub ReadUserEmailInfo { if ( (stat("$LogDir/UserEmailInfo.pl"))[9] != $UserEmailInfoMTime ) { do "$LogDir/UserEmailInfo.pl"; $UserEmailInfoMTime = (stat("$LogDir/UserEmailInfo.pl"))[9]; } } # # Check if the user is privileged. A privileged user can access # any information (backup files, logs, status pages etc). # # A user is privileged if they belong to the group # $Conf{CgiAdminUserGroup}, or they are in $Conf{CgiAdminUsers} # or they are the user assigned to a host in the host file. # sub CheckPermission { my($host) = @_; my $Privileged = 0; return 0 if ( $User eq "" && $Conf{CgiAdminUsers} ne "*" || $host ne "" && !defined($Hosts->{$host}) ); if ( $Conf{CgiAdminUserGroup} ne "" ) { for ( split(/\s+/, $Conf{CgiAdminUserGroup}) ) { my($n, $p, $gid, $mem) = getgrnam($_); $Privileged ||= ($mem =~ /\b\Q$User\E\b/); last if ( $Privileged ); } } if ( $Conf{CgiAdminUsers} ne "" ) { $Privileged ||= ($Conf{CgiAdminUsers} =~ /\b\Q$User\E\b/); $Privileged ||= $Conf{CgiAdminUsers} eq "*"; } $PrivAdmin = $Privileged; return $Privileged if ( !defined($host) ); $Privileged ||= $User eq $Hosts->{$host}{user}; $Privileged ||= defined($Hosts->{$host}{moreUsers}{$User}); return $Privileged; } # # Returns the list of hosts that should appear in the navigation bar # for this user. If $getAll is set, the admin gets all the hosts. # Otherwise, regular users get hosts for which they are the user or # are listed in the moreUsers column in the hosts file. # sub GetUserHosts { my($getAll) = @_; my @hosts; if ( $getAll && CheckPermission() ) { @hosts = sort keys %$Hosts; } else { @hosts = sort grep { $Hosts->{$_}{user} eq $User || defined($Hosts->{$_}{moreUsers}{$User}) } keys(%$Hosts); } return @hosts; } # # Given a host name tries to find the IP address. For non-dhcp hosts # we just return the host name. For dhcp hosts we check the address # the user is using ($ENV{REMOTE_ADDR}) and also the last-known IP # address for $host. (Later we should replace this with a broadcast # nmblookup.) # sub ConfirmIPAddress { my($host) = @_; my $ipAddr = $host; if ( defined($Hosts->{$host}) && $Hosts->{$host}{dhcp} && $ENV{REMOTE_ADDR} =~ /^(\d+[\.\d]*)$/ ) { $ipAddr = $1; my($netBiosHost, $netBiosUser) = $bpc->NetBiosInfoGet($ipAddr); if ( $netBiosHost ne $host ) { my($tryIP); GetStatusInfo("host(${EscURI($host)})"); if ( defined($StatusHost{dhcpHostIP}) && $StatusHost{dhcpHostIP} ne $ipAddr ) { $tryIP = eval("qq{$Lang->{tryIP}}"); ($netBiosHost, $netBiosUser) = $bpc->NetBiosInfoGet($StatusHost{dhcpHostIP}); } if ( $netBiosHost ne $host ) { ErrorExit(eval("qq{$Lang->{Can_t_find_IP_address_for}}"), eval("qq{$Lang->{host_is_a_DHCP_host}}")); } $ipAddr = $StatusHost{dhcpHostIP}; } } return $ipAddr; } ########################################################################### # HTML layout subroutines ########################################################################### sub Header { my($title, $content, $noBrowse, $contentSub, $contentPost) = @_; my @adminLinks = ( {link => "?action=status", name => $Lang->{Status}}, {link => "?action=summary", name => $Lang->{PC_Summary}}, { link => "?action=editConfig", name => $Lang->{CfgEdit_Edit_Config}, priv => 1 }, { link => "?action=editConfig&newMenu=hosts", name => $Lang->{CfgEdit_Edit_Hosts}, priv => 1 }, { link => "?action=adminOpts", name => $Lang->{Admin_Options}, priv => 1 }, { link => "?action=view&type=LOG", name => $Lang->{LOG_file}, priv => 1 }, { link => "?action=LOGlist", name => $Lang->{Old_LOGs}, priv => 1 }, { link => "?action=emailSummary", name => $Lang->{Email_summary}, priv => 1 }, { link => "?action=queue", name => $Lang->{Current_queues}, priv => 1 }, @{$Conf{CgiNavBarLinks} || []}, ); my $host = $In{host}; binmode(select, ":utf8"); print $Cgi->header(-charset => "utf-8"); print < $title $Conf{CgiHeaders}