Blame src/MirrorJob.h

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