def set_permissions(self): '''set access permission bits equal to source''' verbose(dryrun_msg(' os.chmod(%s, %04o)' % (self.name, self.stat.mode & 07777))) unix_out('chmod 0%o %s' % (self.stat.mode & 07777, self.name)) if not synctool.lib.DRY_RUN: try: os.chmod(self.name, self.stat.mode & 07777) except OSError as err: error('failed to chmod %04o %s : %s' % (self.stat.mode & 07777, self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'mode %s' % self.name)
def upgrade(self): msg = 'upgrading packages' verbose(dryrun_msg(msg)) # log the upgrade action ... # don't know which packages are upgraded here, sorry log(msg)
def set_permissions(self): '''set permissions of symlink (if possible)''' # check if this platform supports lchmod() # Linux does not have lchmod: its symlinks are always mode 0777 if not hasattr(os, 'lchmod'): return verbose(dryrun_msg(' os.lchmod(%s, %04o)' % (self.name, self.stat.mode & 07777))) unix_out('lchmod 0%o %s' % (self.stat.mode & 07777, self.name)) if not synctool.lib.DRY_RUN: try: os.lchmod(self.name, self.stat.mode & 07777) except OSError as err: error('failed to lchmod %04o %s : %s' % (self.stat.mode & 07777, self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'mode %s' % self.name)
def create(self): '''make a fifo''' verbose(dryrun_msg(' os.mkfifo(%s)' % self.name)) unix_out('mkfifo %s' % self.name) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mkfifo(self.name, self.stat.mode & 0777) except OSError as err: error('failed to create fifo %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'fifo %s' % self.name)
def create(self): # type: () -> None '''make a fifo''' verbose(dryrun_msg(' os.mkfifo(%s)' % self.name)) unix_out('mkfifo %s' % self.name) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mkfifo(self.name, self.stat.mode & 0777) except OSError as err: error('failed to create fifo %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'fifo %s' % self.name)
def create(self): '''create symbolic link''' verbose(dryrun_msg(' os.symlink(%s, %s)' % (self.oldpath, self.name))) unix_out('ln -s %s %s' % (self.oldpath, self.name)) terse(synctool.lib.TERSE_LINK, self.name) if not synctool.lib.DRY_RUN: try: os.symlink(self.oldpath, self.name) except OSError as err: error('failed to create symlink %s -> %s : %s' % (self.name, self.oldpath, err.strerror)) terse(TERSE_FAIL, 'link %s' % self.name)
def create(self): '''create symbolic link''' verbose(dryrun_msg(' os.symlink(%s, %s)' % (self.oldpath, self.name))) unix_out('ln -s %s %s' % (self.oldpath, self.name)) terse(synctool.lib.TERSE_LINK, self.name) if not synctool.lib.DRY_RUN: try: os.symlink(self.oldpath, self.name) except OSError as err: error('failed to create symlink %s -> %s : %s' % (self.name, self.oldpath, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'link %s' % self.name)
def set_owner(self): '''set ownership equal to source''' verbose(dryrun_msg(' os.chown(%s, %d, %d)' % (self.name, self.stat.uid, self.stat.gid))) unix_out('chown %s.%s %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name)) if not synctool.lib.DRY_RUN: try: os.chown(self.name, self.stat.uid, self.stat.gid) except OSError as err: error('failed to chown %s.%s %s : %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'owner %s' % self.name)
def move_saved(self): '''move existing entry to .saved''' verbose(dryrun_msg('saving %s as %s.saved' % (self.name, self.name))) unix_out('mv %s %s.saved' % (self.name, self.name)) if not synctool.lib.DRY_RUN: verbose(' os.rename(%s, %s.saved)' % (self.name, self.name)) try: os.rename(self.name, '%s.saved' % self.name) except OSError as err: stderr('failed to save %s as %s.saved : %s' % (self.name, self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'save %s.saved' % self.name)
def create(self): '''copy file''' if not self.exists: terse(synctool.lib.TERSE_NEW, self.name) verbose(dryrun_msg(' copy %s %s' % (self.src_path, self.name))) unix_out('cp %s %s' % (self.src_path, self.name)) if not synctool.lib.DRY_RUN: try: # copy file shutil.copy(self.src_path, self.name) except (OSError, IOError) as err: error('failed to copy %s to %s: %s' % (prettypath(self.src_path), self.name, err.strerror)) terse(TERSE_FAIL, self.name)
def set_owner(self): # type: () -> None '''set ownership equal to source''' verbose(dryrun_msg(' os.chown(%s, %d, %d)' % (self.name, self.stat.uid, self.stat.gid))) unix_out('chown %s.%s %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name)) if not synctool.lib.DRY_RUN: try: os.chown(self.name, self.stat.uid, self.stat.gid) except OSError as err: error('failed to chown %s.%s %s : %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name, err.strerror)) terse(TERSE_FAIL, 'owner %s' % self.name)
def set_times(self): '''set access and modification times''' # only mtime is shown verbose(dryrun_msg(' os.utime(%s, %s)' % (self.name, print_timestamp(self.stat.mtime)))) # print timestamp in other format dt = datetime.datetime.fromtimestamp(self.stat.mtime) time_str = dt.strftime('%Y%m%d%H%M.%S') unix_out('touch -t %s %s' % (time_str, self.name)) if not synctool.lib.DRY_RUN: try: os.utime(self.name, (self.stat.atime, self.stat.mtime)) except OSError as err: error('failed to set utime on %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'utime %s' % self.name)
def create(self): # type: () -> None '''copy file''' if not self.exists: terse(synctool.lib.TERSE_NEW, self.name) verbose(dryrun_msg(' copy %s %s' % (self.src_path, self.name))) unix_out('cp %s %s' % (self.src_path, self.name)) if not synctool.lib.DRY_RUN: try: # copy file shutil.copy(self.src_path, self.name) except (OSError, IOError) as err: error('failed to copy %s to %s: %s' % (prettypath(self.src_path), self.name, err.strerror)) terse(TERSE_FAIL, self.name)
def check_purge_timestamp(self): '''check timestamp between src and dest Returns True if same, False if not ''' # This is only used for purge/ # check() has already determined that the files are the same # Now only check the timestamp ... # FIXME have SyncStat time fields # Note that SyncStat objects do not know the timestamps; # they are not cached only to save memory # So now we have to os.stat() again to get the times; it is # not a big problem because this func is used for purge_single only # src_path is under $purge/ # dest_path is in the filesystem try: src_stat = os.lstat(self.src_path) except OSError as err: error('stat(%s) failed: %s' % (self.src_path, err.strerror)) return False try: dest_stat = os.lstat(self.dest_path) except OSError as err: error('stat(%s) failed: %s' % (self.dest_path, err.strerror)) return False # FIXME set_times() should not be called for symlinks if src_stat.st_mtime > dest_stat.st_mtime: stdout('%s mismatch (only timestamp)' % self.dest_path) terse(synctool.lib.TERSE_WARNING, '%s (only timestamp)' % self.dest_path) verbose(dryrun_msg(' os.utime(%s, %s)' '' % (self.dest_path, time.ctime(src_stat.st_mtime)))) unix_out('touch -r %s %s' % (self.src_path, self.dest_path)) vnode = self.vnode_obj() vnode.set_times(src_stat.st_atime, src_stat.st_mtime) return False return True
def set_times(self): # type: () -> None '''set access and modification times''' # only mtime is shown verbose(dryrun_msg(' os.utime(%s, %s)' % (self.name, print_timestamp(self.stat.mtime)))) # print timestamp in other format dt = datetime.datetime.fromtimestamp(self.stat.mtime) time_str = dt.strftime('%Y%m%d%H%M.%S') unix_out('touch -t %s %s' % (time_str, self.name)) if not synctool.lib.DRY_RUN: try: os.utime(self.name, (self.stat.atime, self.stat.mtime)) except OSError as err: error('failed to set utime on %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'utime %s' % self.name)
def create(self): '''make a block device file''' major = os.major(self.src_stat.st_rdev) minor = os.minor(self.src_stat.st_rdev) verbose(dryrun_msg(' os.mknod(%s, BLK %d,%d)' % (self.name, major, minor))) unix_out('mknod %s b %d %d' % (self.name, major, minor)) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mknod(self.name, (self.src_stat.st_mode & 0777) | stat.S_IFBLK, os.makedev(major, minor)) except OSError as err: error('failed to create device %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'device %s' % self.name)
def check_purge_timestamp(self): '''check timestamp between src and dest Returns True if same, False if not ''' # This is only used for purge/ # check() has already determined that the files are the same # Now only check the timestamp ... # Note that SyncStat objects do not know the timestamps; # they are not cached only to save memory # So now we have to os.stat() again to get the times; it is # not a big problem because this func is used for purge_single only # src_path is under $purge/ # dest_path is in the filesystem try: src_stat = os.lstat(self.src_path) except OSError as err: error('stat(%s) failed: %s' % (self.src_path, err.strerror)) return False try: dest_stat = os.lstat(self.dest_path) except OSError as err: error('stat(%s) failed: %s' % (self.dest_path, err.strerror)) return False if src_stat.st_mtime > dest_stat.st_mtime: stdout('%s mismatch (only timestamp)' % self.dest_path) terse(synctool.lib.TERSE_WARNING, '%s (only timestamp)' % self.dest_path) verbose( dryrun_msg(' os.utime(%s, %s)' '' % (self.dest_path, time.ctime(src_stat.st_mtime)))) unix_out('touch -r %s %s' % (self.src_path, self.dest_path)) vnode = self.vnode_obj() vnode.set_times(src_stat.st_atime, src_stat.st_mtime) return False return True
def create(self): # type: () -> None '''make a character device file''' major = os.major(self.src_stat.st_rdev) # type: ignore minor = os.minor(self.src_stat.st_rdev) # type: ignore verbose(dryrun_msg(' os.mknod(%s, CHR %d,%d)' % (self.name, major, minor))) unix_out('mknod %s c %d %d' % (self.name, major, minor)) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mknod(self.name, (self.src_stat.st_mode & 0777) | stat.S_IFCHR, os.makedev(major, minor)) except OSError as err: error('failed to create device %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'device %s' % self.name)
def set_owner(self): '''set ownership of symlink''' if not hasattr(os, 'lchown'): # you never know return verbose(dryrun_msg(' os.lchown(%s, %d, %d)' % (self.name, self.stat.uid, self.stat.gid))) unix_out('lchown %s.%s %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name)) if not synctool.lib.DRY_RUN: try: os.lchown(self.name, self.stat.uid, self.stat.gid) except OSError as err: error('failed to lchown %s.%s %s : %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'owner %s' % self.name)
def move_saved(self): '''move existing entry to .saved''' # do not save files that already are .saved _, ext = os.path.splitext(self.name) if ext == '.saved': return verbose(dryrun_msg('saving %s as %s.saved' % (self.name, self.name))) unix_out('mv %s %s.saved' % (self.name, self.name)) if not synctool.lib.DRY_RUN: verbose(' os.rename(%s, %s.saved)' % (self.name, self.name)) try: os.rename(self.name, '%s.saved' % self.name) except OSError as err: error('failed to save %s as %s.saved : %s' % (self.name, self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'save %s.saved' % self.name)
def create(self): '''create directory''' if synctool.lib.path_exists(self.name): # it can happen that the dir already exists # due to recursion in visit() + VNode.mkdir_basepath() # So this is double checked for dirs that did not exist return verbose(dryrun_msg(' os.mkdir(%s)' % self.name)) unix_out('mkdir %s' % self.name) terse(synctool.lib.TERSE_MKDIR, self.name) if not synctool.lib.DRY_RUN: try: os.mkdir(self.name, self.stat.mode & 07777) except OSError as err: error('failed to make directory %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'mkdir %s' % self.name)
def create(self): # type: () -> None '''make a block device file''' major = os.major(self.src_stat.st_rdev) # type: ignore minor = os.minor(self.src_stat.st_rdev) # type: ignore verbose(dryrun_msg(' os.mknod(%s, BLK %d,%d)' % (self.name, major, minor))) unix_out('mknod %s b %d %d' % (self.name, major, minor)) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mknod(self.name, (self.src_stat.st_mode & 0777) | stat.S_IFBLK, os.makedev(major, minor)) except OSError as err: error('failed to create device %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'device %s' % self.name)
def create(self): # type: () -> None '''create directory''' if synctool.lib.path_exists(self.name): # it can happen that the dir already exists # due to recursion in visit() + VNode.mkdir_basepath() # So this is double checked for dirs that did not exist return verbose(dryrun_msg(' os.mkdir(%s)' % self.name)) unix_out('mkdir %s' % self.name) terse(synctool.lib.TERSE_MKDIR, self.name) if not synctool.lib.DRY_RUN: try: os.mkdir(self.name, self.stat.mode & 07777) except OSError as err: error('failed to make directory %s : %s' % (self.name, err.strerror)) terse(TERSE_FAIL, 'mkdir %s' % self.name)
def set_owner(self): # type: () -> None '''set ownership of symlink''' if not hasattr(os, 'lchown'): # you never know return verbose(dryrun_msg(' os.lchown(%s, %d, %d)' % (self.name, self.stat.uid, self.stat.gid))) unix_out('lchown %s.%s %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name)) if not synctool.lib.DRY_RUN: try: os.lchown(self.name, self.stat.uid, self.stat.gid) except OSError as err: error('failed to lchown %s.%s %s : %s' % (self.stat.ascii_uid(), self.stat.ascii_gid(), self.name, err.strerror)) terse(TERSE_FAIL, 'owner %s' % self.name)
def create(self): '''copy file''' if not self.exists: terse(synctool.lib.TERSE_NEW, self.name) verbose(dryrun_msg(' copy %s %s' % (self.src_path, self.name))) unix_out('cp %s %s' % (self.src_path, self.name)) if not synctool.lib.DRY_RUN: try: # copy file shutil.copy(self.src_path, self.name) if synctool.param.SYNC_TIMES: shutil.copystat(self.src_path, self.name) except IOError as err: error('failed to copy %s to %s: %s' % (prettypath(self.src_path), self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, self.name)
def create(self): '''make a character device file''' major = os.major(self.src_stat.st_rdev) minor = os.minor(self.src_stat.st_rdev) verbose( dryrun_msg(' os.mknod(%s, CHR %d,%d)' % (self.name, major, minor))) unix_out('mknod %s c %d %d' % (self.name, major, minor)) terse(synctool.lib.TERSE_NEW, self.name) if not synctool.lib.DRY_RUN: try: os.mknod(self.name, (self.src_stat.st_mode & 0777) | stat.S_IFCHR, os.makedev(major, minor)) except OSError as err: error('failed to create device %s : %s' % (self.name, err.strerror)) terse(synctool.lib.TERSE_FAIL, 'device %s' % self.name)