Welcome to mirror list, hosted at ThFree Co, Russian Federation.

SnapshotUtility.cs « Snapshots « Library « Duplicati - github.com/duplicati/duplicati.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: bddfd82018183e4ac09dd687143ffdb47791a9d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#region Disclaimer / License
// Copyright (C) 2015, The Duplicati Team
// http://www.duplicati.com, info@duplicati.com
// 
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// 
// This library 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
// Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
// 
#endregion

using System.Collections.Generic;
using System.IO;
using Duplicati.Library.Common.IO;

namespace Duplicati.Library.Snapshots
{
    /// <summary>
    /// Simple helper to initialize and load a snapshot implementation for the current OS
    /// </summary>
    public static class SnapshotUtility
    {
        /// <summary>
        /// Loads a snapshot implementation for the current OS
        /// </summary>
        /// <param name="folders">The list of folders to create snapshots of</param>
        /// <param name="options">A set of commandline options</param>
        /// <returns>The ISnapshotService implementation</returns>
        public static ISnapshotService CreateSnapshot(IEnumerable<string> folders, Dictionary<string, string> options)
        {
            return
                Utility.Utility.IsClientLinux
                       ? CreateLinuxSnapshot(folders)
                       : CreateWindowsSnapshot(folders, options);
            
        }

        // The two loader methods below guard agains the type system attempting to load types
        // related to the OS specific implementations which may not be present for
        // the operation system we are not running on (i.e. prevent loading AlphaVSS on Linux)

        /// <summary>
        /// Loads a snapshot implementation for Linux
        /// </summary>
        /// <param name="folders">The list of folders to create snapshots of</param>
        /// <returns>The ISnapshotService implementation</returns>
        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        private static ISnapshotService CreateLinuxSnapshot(IEnumerable<string> folders)
        {
            return new LinuxSnapshot(folders);
        }

        /// <summary>
        /// Loads a snapshot implementation for Windows
        /// </summary>
        /// <param name="folders">The list of folders to create snapshots of</param>
        /// <param name="options">A set of commandline options</param>
        /// <returns>The ISnapshotService implementation</returns>
        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        private static ISnapshotService CreateWindowsSnapshot(IEnumerable<string> folders, Dictionary<string, string> options)
        {
            return new WindowsSnapshot(folders, options);
        }

        /// <summary>
        /// Extension method for ISnapshotService which determines whether the given path is a symlink.
        /// </summary>
        /// <param name="snapshot">ISnapshotService implementation</param>
        /// <param name="path">File or folder path</param>
        /// <returns>Whether the path is a symlink</returns>
        public static bool IsSymlink(this ISnapshotService snapshot, string path)
        {
            return snapshot.IsSymlink(path, snapshot.GetAttributes(path));
        }

        /// <summary>
        /// Extension method for ISnapshotService which determines whether the given path is a symlink.
        /// </summary>
        /// <param name="snapshot">ISnapshotService implementation</param>
        /// <param name="path">File or folder path</param>
        /// <param name="attributes">File attributes</param>
        /// <returns>Whether the path is a symlink</returns>
        public static bool IsSymlink(this ISnapshotService snapshot, string path, FileAttributes attributes)
        {
            // Not all reparse points are symlinks.
            // For example, on Windows 10 Fall Creator's Update, the OneDrive folder (and all subfolders)
            // are reparse points, which allows the folder to hook into the OneDrive service and download things on-demand.
            // If we can't find a symlink target for the current path, we won't treat it as a symlink.
            return (attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint && !string.IsNullOrEmpty(snapshot.GetSymlinkTarget(path));
        }

        /// <summary>
        /// Extension method for ISystemIO which determines whether the given path is a symlink.
        /// </summary>
        /// <param name="systemIO">ISystemIO implementation</param>
        /// <param name="path">File or folder path</param>
        /// <returns>Whether the path is a symlink</returns>
        public static bool IsSymlink(this ISystemIO systemIO, string path)
        {
            return systemIO.IsSymlink(path, systemIO.GetFileAttributes(path));
        }

        /// <summary>
        /// Extension method for ISystemIO which determines whether the given path is a symlink.
        /// </summary>
        /// <param name="systemIO">ISystemIO implementation</param>
        /// <param name="path">File or folder path</param>
        /// <param name="attributes">File attributes</param>
        /// <returns>Whether the path is a symlink</returns>
        public static bool IsSymlink(this ISystemIO systemIO, string path, FileAttributes attributes)
        {
            // Not all reparse points are symlinks.
            // For example, on Windows 10 Fall Creator's Update, the OneDrive folder (and all subfolders)
            // are reparse points, which allows the folder to hook into the OneDrive service and download things on-demand.
            // If we can't find a symlink target for the current path, we won't treat it as a symlink.
            return (attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint && !string.IsNullOrEmpty(systemIO.GetSymlinkTarget(path));
        }
    }
}