|
Packit Service |
a2489d |
/*
|
|
Packit Service |
a2489d |
* lftp - file transfer program
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* Copyright (c) 1996-2017 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
a2489d |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
a2489d |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit Service |
a2489d |
* (at your option) any later version.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
a2489d |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
a2489d |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
a2489d |
* GNU General Public License for more details.
|
|
Packit Service |
a2489d |
*
|
|
Packit Service |
a2489d |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
a2489d |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
a2489d |
*/
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#ifndef MIRRORJOB_H
|
|
Packit Service |
a2489d |
#define MIRRORJOB_H
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#include "FileAccess.h"
|
|
Packit Service |
a2489d |
#include "FileSet.h"
|
|
Packit Service |
a2489d |
#include "Job.h"
|
|
Packit Service |
a2489d |
#include "PatternSet.h"
|
|
Packit Service |
a2489d |
#include "misc.h"
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
class MirrorJob : public Job
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
enum recursion_mode_t {
|
|
Packit Service |
a2489d |
RECURSION_ALWAYS,
|
|
Packit Service |
a2489d |
RECURSION_NEVER,
|
|
Packit Service |
a2489d |
RECURSION_MISSING,
|
|
Packit Service |
a2489d |
RECURSION_NEWER,
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
private:
|
|
Packit Service |
a2489d |
enum state_t
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
INITIAL_STATE,
|
|
Packit Service |
a2489d |
MAKE_TARGET_DIR,
|
|
Packit Service |
a2489d |
CHANGING_DIR_SOURCE,
|
|
Packit Service |
a2489d |
CHANGING_DIR_TARGET,
|
|
Packit Service |
a2489d |
GETTING_LIST_INFO,
|
|
Packit Service |
a2489d |
WAITING_FOR_TRANSFER,
|
|
Packit Service |
a2489d |
TARGET_REMOVE_OLD,
|
|
Packit Service |
a2489d |
TARGET_REMOVE_OLD_FIRST,
|
|
Packit Service |
a2489d |
TARGET_CHMOD,
|
|
Packit Service |
a2489d |
TARGET_MKDIR,
|
|
Packit Service |
a2489d |
SOURCE_REMOVING_SAME,
|
|
Packit Service |
a2489d |
FINISHING,
|
|
Packit Service |
a2489d |
LAST_EXEC,
|
|
Packit Service |
a2489d |
DONE
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
state_t state;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
FileAccessRef source_session;
|
|
Packit Service |
a2489d |
FileAccessRef target_session;
|
|
Packit Service |
a2489d |
bool target_is_local;
|
|
Packit Service |
a2489d |
bool source_is_local;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
long long bytes_transferred;
|
|
Packit Service |
a2489d |
long long bytes_to_transfer;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Ref<FileSet> target_set;
|
|
Packit Service |
a2489d |
Ref<FileSet> target_set_excluded;
|
|
Packit Service |
a2489d |
Ref<FileSet> source_set;
|
|
Packit Service |
a2489d |
Ref<FileSet> target_set_recursive;
|
|
Packit Service |
a2489d |
Ref<FileSet> source_set_recursive;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Ref<FileSet> to_transfer;
|
|
Packit Service |
a2489d |
Ref<FileSet> to_mkdir;
|
|
Packit Service |
a2489d |
Ref<FileSet> same;
|
|
Packit Service |
a2489d |
Ref<FileSet> to_rm;
|
|
Packit Service |
a2489d |
Ref<FileSet> to_rm_mismatched;
|
|
Packit Service |
a2489d |
Ref<FileSet> old_files_set;
|
|
Packit Service |
a2489d |
Ref<FileSet> new_files_set;
|
|
Packit Service |
a2489d |
Ref<FileSet> to_rm_src;
|
|
Packit Service |
a2489d |
void InitSets(); // deduce above sets from source_set and target_set
|
|
Packit Service |
a2489d |
bool only_dirs; // to_transfer (or to_mkdir) contains directories only
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void RemoveSourceLater(const FileInfo *fi) {
|
|
Packit Service |
a2489d |
if(!remove_source_files)
|
|
Packit Service |
a2489d |
return;
|
|
Packit Service |
a2489d |
if(!to_rm_src)
|
|
Packit Service |
a2489d |
to_rm_src=new FileSet();
|
|
Packit Service |
a2489d |
to_rm_src->Add(new FileInfo(*fi));
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void AddBytesTransferred(long long b) {
|
|
Packit Service |
a2489d |
bytes_transferred+=b;
|
|
Packit Service |
a2489d |
if(parent_mirror)
|
|
Packit Service |
a2489d |
parent_mirror->AddBytesTransferred(b);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void AddBytesToTransfer(long long b) {
|
|
Packit Service |
a2489d |
bytes_to_transfer+=b;
|
|
Packit Service |
a2489d |
if(parent_mirror)
|
|
Packit Service |
a2489d |
parent_mirror->AddBytesToTransfer(b);
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void HandleFile(FileInfo *);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool create_target_dir;
|
|
Packit Service |
a2489d |
bool no_target_dir; // target directory does not exist (for script_only)
|
|
Packit Service |
a2489d |
bool remove_this_source_dir;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
SMTaskRef<ListInfo> source_list_info;
|
|
Packit Service |
a2489d |
SMTaskRef<ListInfo> target_list_info;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring_c source_dir;
|
|
Packit Service |
a2489d |
xstring_c source_relative_dir;
|
|
Packit Service |
a2489d |
xstring_c target_dir;
|
|
Packit Service |
a2489d |
xstring_c target_relative_dir;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
struct Statistics
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
int tot_files,new_files,mod_files,del_files;
|
|
Packit Service |
a2489d |
int dirs,del_dirs;
|
|
Packit Service |
a2489d |
int tot_symlinks,new_symlinks,mod_symlinks,del_symlinks;
|
|
Packit Service |
a2489d |
int error_count;
|
|
Packit Service |
a2489d |
long long bytes;
|
|
Packit Service |
a2489d |
double time;
|
|
Packit Service |
a2489d |
Statistics();
|
|
Packit Service |
a2489d |
void Reset();
|
|
Packit Service |
a2489d |
void Add(const Statistics &);
|
|
Packit Service |
a2489d |
bool HaveSomethingDone(unsigned mirror_flags);
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
Statistics stats;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
double transfer_time_elapsed;
|
|
Packit Service |
a2489d |
TimeDate transfer_start_ts;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
/* root_transfer_count is the global counter in the root mirror,
|
|
Packit Service |
a2489d |
* and weight of a non-root mirror in global transfer_count otherwise. */
|
|
Packit Service |
a2489d |
int root_transfer_count;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
unsigned flags;
|
|
Packit Service |
a2489d |
recursion_mode_t recursion_mode;
|
|
Packit Service |
a2489d |
int max_error_count;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
Ref<PatternSet> top_exclude;
|
|
Packit Service |
a2489d |
Ref<PatternSet> my_exclude;
|
|
Packit Service |
a2489d |
const PatternSet *exclude;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
bool create_remote_dir;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Report(const char *fmt,...) PRINTF_LIKE(2,3);
|
|
Packit Service |
a2489d |
void va_Report(const char *fmt,va_list v);
|
|
Packit Service |
a2489d |
int verbose_report;
|
|
Packit Service |
a2489d |
MirrorJob *parent_mirror;
|
|
Packit Service |
a2489d |
MirrorJob *root_mirror;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
time_t newer_than;
|
|
Packit Service |
a2489d |
time_t older_than;
|
|
Packit Service |
a2489d |
Ref<Range> my_size_range;
|
|
Packit Service |
a2489d |
const Range *size_range;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring_c script_name;
|
|
Packit Service |
a2489d |
FILE *script;
|
|
Packit Service |
a2489d |
bool script_only;
|
|
Packit Service |
a2489d |
bool script_needs_closing;
|
|
Packit Service |
a2489d |
bool use_cache;
|
|
Packit Service |
a2489d |
bool remove_source_files;
|
|
Packit Service |
a2489d |
bool remove_source_dirs;
|
|
Packit Service |
a2489d |
bool skip_noaccess;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int parallel;
|
|
Packit Service |
a2489d |
int pget_n;
|
|
Packit Service |
a2489d |
int pget_minchunk;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
xstring_c on_change;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
mode_t get_mode_mask();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int source_redirections;
|
|
Packit Service |
a2489d |
int target_redirections;
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void HandleChdir(FileAccessRef& session, int &redirections);
|
|
Packit Service |
a2489d |
void HandleListInfoCreation(const FileAccessRef& session,SMTaskRef<ListInfo>& list_info,
|
|
Packit Service |
a2489d |
const char *relative_dir);
|
|
Packit Service |
a2489d |
void HandleListInfo(SMTaskRef<ListInfo>& list_info,Ref<FileSet>& set,Ref<FileSet> *fsx=0);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void MirrorStarted();
|
|
Packit Service |
a2489d |
void MirrorFinished();
|
|
Packit Service |
a2489d |
void TransferStarted(class CopyJob *cp);
|
|
Packit Service |
a2489d |
void JobStarted(Job *j);
|
|
Packit Service |
a2489d |
void TransferFinished(Job *j);
|
|
Packit Service |
a2489d |
void JobFinished(Job *j);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
off_t GetBytesCount();
|
|
Packit Service |
a2489d |
double GetTimeSpent();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
public:
|
|
Packit Service |
a2489d |
enum
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
ALLOW_SUID=1<<0,
|
|
Packit Service |
a2489d |
DELETE=1<<1,
|
|
Packit Service |
a2489d |
NO_RECURSION=1<<2,
|
|
Packit Service |
a2489d |
ONLY_NEWER=1<<3,
|
|
Packit Service |
a2489d |
NO_PERMS=1<<4,
|
|
Packit Service |
a2489d |
CONTINUE=1<<5,
|
|
Packit Service |
a2489d |
REPORT_NOT_DELETED=1<<6,
|
|
Packit Service |
a2489d |
RETR_SYMLINKS=1<<7,
|
|
Packit Service |
a2489d |
NO_UMASK=1<<8,
|
|
Packit Service |
a2489d |
ALLOW_CHOWN=1<<9,
|
|
Packit Service |
a2489d |
IGNORE_TIME=1<<10,
|
|
Packit Service |
a2489d |
REMOVE_FIRST=1<<11,
|
|
Packit Service |
a2489d |
IGNORE_SIZE=1<<12,
|
|
Packit Service |
a2489d |
NO_SYMLINKS=1<<13,
|
|
Packit Service |
a2489d |
LOOP=1<<14,
|
|
Packit Service |
a2489d |
ONLY_EXISTING=1<<15,
|
|
Packit Service |
a2489d |
NO_EMPTY_DIRS=1<<16,
|
|
Packit Service |
a2489d |
DEPTH_FIRST=1<<17,
|
|
Packit Service |
a2489d |
ASCII=1<<18,
|
|
Packit Service |
a2489d |
SCAN_ALL_FIRST=1<<19,
|
|
Packit Service |
a2489d |
OVERWRITE=1<<20,
|
|
Packit Service |
a2489d |
UPLOAD_OLDER=1<<21,
|
|
Packit Service |
a2489d |
TRANSFER_ALL=1<<22,
|
|
Packit Service |
a2489d |
TARGET_FLAT=1<<23,
|
|
Packit Service |
a2489d |
DELETE_EXCLUDED=1<<24,
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
void SetFlags(unsigned f,bool v)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
if(v)
|
|
Packit Service |
a2489d |
flags|=f;
|
|
Packit Service |
a2489d |
else
|
|
Packit Service |
a2489d |
flags&=~f;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
bool FlagsSet(unsigned f) const { return (flags&f)==f; }
|
|
Packit Service |
a2489d |
bool FlagSet(unsigned f) const { return (flags&f); }
|
|
Packit Service |
a2489d |
bool AnyFlagSet(unsigned f) const { return (flags&f); }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
MirrorJob(MirrorJob *parent,FileAccess *f,FileAccess *target,
|
|
Packit Service |
a2489d |
const char *new_source_dir,const char *new_target_dir);
|
|
Packit Service |
a2489d |
~MirrorJob();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
int Do();
|
|
Packit Service |
a2489d |
int Done() { return state==DONE; }
|
|
Packit Service |
a2489d |
void ShowRunStatus(const SMTaskRef<StatusLine>&);
|
|
Packit Service |
a2489d |
xstring& FormatStatus(xstring&,int v,const char *);
|
|
Packit Service |
a2489d |
xstring& FormatShortStatus(xstring&);
|
|
Packit Service |
a2489d |
void SayFinal() { PrintStatus(0,""); }
|
|
Packit Service |
a2489d |
int ExitCode() { return stats.error_count!=0; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SetExclude(PatternSet *x) { my_exclude=x; exclude=my_exclude; }
|
|
Packit Service |
a2489d |
void SetExclude(const PatternSet *x) { exclude=x; }
|
|
Packit Service |
a2489d |
void SetSizeRange(Range *r) { my_size_range=r; size_range=my_size_range; }
|
|
Packit Service |
a2489d |
void SetSizeRange(const Range *r) { size_range=r; }
|
|
Packit Service |
a2489d |
void SetTopExclude(PatternSet *x) { top_exclude=x; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SetVerbose(int v) { verbose_report=v; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void CreateRemoteDir() { create_remote_dir=true; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SetNewerThan(const char *file);
|
|
Packit Service |
a2489d |
void SetOlderThan(const char *file);
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void UseCache(bool u) { use_cache=u; }
|
|
Packit Service |
a2489d |
void RemoveSourceFiles() { remove_source_files=true; }
|
|
Packit Service |
a2489d |
void RemoveSourceDirs() { remove_source_files=remove_source_dirs=true; }
|
|
Packit Service |
a2489d |
void SkipNoAccess() { skip_noaccess=true; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void SetParallel(int p) { parallel=p; }
|
|
Packit Service |
a2489d |
void SetPGet(int n) { pget_n=n; }
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
void Fg();
|
|
Packit Service |
a2489d |
void Bg();
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
const char *SetRecursionMode(const char *r);
|
|
Packit Service |
a2489d |
const char *SetScriptFile(const char *n);
|
|
Packit Service |
a2489d |
void ScriptOnly(bool yes=true)
|
|
Packit Service |
a2489d |
{
|
|
Packit Service |
a2489d |
script_only=yes;
|
|
Packit Service |
a2489d |
}
|
|
Packit Service |
a2489d |
void SetMaxErrorCount(int ec) { max_error_count=ec; }
|
|
Packit Service |
a2489d |
void SetOnChange(const char *oc);
|
|
Packit Service |
a2489d |
static const char *AddPattern(Ref<PatternSet>& exclude,char opt,const char *optarg);
|
|
Packit Service |
a2489d |
static const char *AddPatternsFrom(Ref<PatternSet>& exclude,char opt,const char *file);
|
|
Packit Service |
a2489d |
};
|
|
Packit Service |
a2489d |
|
|
Packit Service |
a2489d |
#endif//MIRRORJOB_H
|