machinery-tool 1.16.4 → 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.git_revision +1 -1
- data/NEWS +10 -0
- data/filters/default_filters.json +21 -20
- data/html/assets/machinery-base.js +4 -0
- data/html/index.html.haml +1 -1
- data/html/partials/changed_managed_files.html.haml +2 -2
- data/html/partials/compare/changed_managed_file_list.html.haml +2 -2
- data/html/partials/compare/changed_managed_files.html.haml +3 -3
- data/html/partials/compare/config_file_list.html.haml +2 -2
- data/html/partials/compare/config_files.html.haml +3 -3
- data/html/partials/compare/packages.html.haml +21 -4
- data/html/partials/compare/repositories.html.haml +10 -7
- data/html/partials/compare/repository_list_apt.html.haml +15 -0
- data/html/partials/compare/repository_list_yum.html.haml +35 -0
- data/html/partials/compare/{repository_list.html.haml → repository_list_zypp.html.haml} +0 -0
- data/html/partials/compare/service_list.html.haml +1 -1
- data/html/partials/compare/services.html.haml +3 -3
- data/html/partials/compare/unmanaged_file_list.html.haml +2 -2
- data/html/partials/compare/unmanaged_files.html.haml +1 -1
- data/html/partials/config_files.html.haml +39 -41
- data/html/partials/repositories.html.haml +1 -23
- data/html/partials/repositories_apt.html.haml +15 -0
- data/html/partials/repositories_yum.html.haml +30 -0
- data/html/partials/repositories_zypp.html.haml +24 -0
- data/html/partials/services.html.haml +2 -2
- data/html/partials/unmanaged_files.html.haml +2 -2
- data/inspect_helpers/dpkg_unmanaged_files.sh +47 -0
- data/inspect_helpers/yum_repositories.py +3 -5
- data/lib/analyze_config_file_diffs_task.rb +11 -1
- data/lib/array.rb +97 -35
- data/lib/autoyast.rb +13 -2
- data/lib/cli.rb +10 -2
- data/lib/config.rb +4 -4
- data/lib/dpkg_database.rb +68 -0
- data/lib/element_filter.rb +2 -0
- data/lib/file_diff.rb +2 -2
- data/lib/file_scope.rb +10 -49
- data/lib/file_validator.rb +10 -4
- data/lib/filter.rb +6 -6
- data/lib/filter_option_parser.rb +1 -1
- data/lib/kiwi_config.rb +13 -10
- data/lib/machinery.rb +2 -0
- data/lib/machinery_helper.rb +1 -1
- data/lib/managed_files_database.rb +200 -0
- data/lib/object.rb +5 -3
- data/lib/remote_system.rb +43 -10
- data/lib/renderer.rb +3 -4
- data/lib/rpm_database.rb +7 -183
- data/lib/scope_file_access_archive.rb +3 -3
- data/lib/scope_file_access_flat.rb +1 -1
- data/lib/server.rb +7 -2
- data/lib/system.rb +50 -22
- data/lib/system_description.rb +3 -3
- data/lib/version.rb +1 -1
- data/lib/workload_mapper.rb +2 -2
- data/machinery-helper/machinery_helper.go +252 -178
- data/machinery-helper/machinery_helper_test.go +121 -121
- data/machinery-helper/mountpoints.go +28 -28
- data/machinery-helper/tar.go +105 -104
- data/machinery-helper/version.go +1 -1
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +19 -8
- data/plugins/changed_managed_files/changed_managed_files_inspector.rb +3 -3
- data/plugins/changed_managed_files/changed_managed_files_model.rb +3 -1
- data/plugins/changed_managed_files/changed_managed_files_renderer.rb +2 -2
- data/plugins/changed_managed_files/schema/system-description-changed-managed-files.schema-v6.json +168 -0
- data/plugins/config_files/config_files_inspector.rb +4 -4
- data/plugins/config_files/config_files_model.rb +3 -1
- data/plugins/config_files/config_files_renderer.rb +2 -2
- data/plugins/config_files/schema/system-description-config-files.schema-v6.json +160 -0
- data/plugins/environment/schema/system-description-environment.schema-v6.json +17 -0
- data/plugins/groups/schema/system-description-groups.schema-v6.json +49 -0
- data/plugins/os/schema/system-description-os.schema-v6.json +21 -0
- data/plugins/packages/packages_inspector.rb +76 -6
- data/plugins/packages/packages_model.rb +31 -12
- data/plugins/packages/packages_renderer.rb +5 -2
- data/plugins/packages/schema/system-description-packages.schema-v6.json +115 -0
- data/plugins/patterns/patterns_inspector.rb +26 -2
- data/plugins/patterns/schema/system-description-patterns.schema-v6.json +58 -0
- data/plugins/repositories/repositories_inspector.rb +41 -14
- data/plugins/repositories/repositories_model.rb +55 -12
- data/plugins/repositories/repositories_renderer.rb +23 -7
- data/plugins/repositories/schema/system-description-repositories.schema-v6.json +165 -0
- data/plugins/services/schema/system-description-services.schema-v6.json +93 -0
- data/plugins/services/services_inspector.rb +88 -22
- data/plugins/services/services_model.rb +9 -15
- data/plugins/services/services_renderer.rb +2 -2
- data/plugins/unmanaged_files/schema/system-description-unmanaged-files.schema-v6.json +162 -0
- data/plugins/unmanaged_files/unmanaged_files_inspector.rb +80 -30
- data/plugins/unmanaged_files/unmanaged_files_model.rb +22 -18
- data/plugins/unmanaged_files/unmanaged_files_renderer.rb +3 -3
- data/plugins/users/schema/system-description-users.schema-v6.json +86 -0
- data/schema/migrations/migrate5to6.rb +101 -0
- data/schema/system-description-global.schema-v6.json +43 -0
- metadata +24 -4
- data/html/assets/landing_page/landing_page.js +0 -10
data/machinery-helper/version.go
CHANGED
Binary file
|
@@ -855,6 +855,10 @@ See the <a href="#Scopes" data-bare-link="true">Scope section</a> for more infor
|
|
855
855
|
This user needs to be allowed to run certain commands using sudo (see
|
856
856
|
PREREQUISITES for more information).
|
857
857
|
To change the default-user use <code>machinery config remote-user=USER</code></p></dd>
|
858
|
+
<dt><code>-p SSH-PORT</code>, <code>--ssh-port SSH-PORT</code> (optional)</dt><dd><p>Specifies the SSH port of the remote SSH server.</p></dd>
|
859
|
+
<dt><code>-i SSH-IDENTITY-FILE</code>, <code>--ssh-identity-file SSH-IDENTITY-FILE</code> (optional)</dt><dd><p>Specifies the SSH private key what should be used to authenticate with the
|
860
|
+
remote SSH server. Keys with a passphrase are not allowed here. Use the ssh-agent
|
861
|
+
instead.</p></dd>
|
858
862
|
<dt><code>-x</code>, <code>--extract-files</code> (optional)</dt><dd><p>Extract changed configuration and unmanaged files from the inspected system.
|
859
863
|
Shortcut for the combination of <code>--extract-changed-config-files</code>,
|
860
864
|
<code>--extract-unmanaged-files</code>, and <code>--extract-changed-managed-files</code></p></dd>
|
@@ -889,10 +893,10 @@ via <code>ssh-copy-id</code> to the inspected host, e.g.: <code>ssh-copy-id root
|
|
889
893
|
<li><p>The system to be inspected needs to have the following commands:</p>
|
890
894
|
|
891
895
|
<ul>
|
892
|
-
<li><code>rpm</code></li>
|
893
|
-
<li><code>zypper</code> or <code>
|
896
|
+
<li><code>rpm</code> or <code>dpkg</code></li>
|
897
|
+
<li><code>zypper</code>, <code>yum</code> or <code>apt-cache</code></li>
|
894
898
|
<li><code>rsync</code></li>
|
895
|
-
<li><code>chkconfig</code></li>
|
899
|
+
<li><code>chkconfig</code>, <code>initctl</code> or <code>systemctl</code></li>
|
896
900
|
<li><code>cat</code></li>
|
897
901
|
<li><code>sed</code></li>
|
898
902
|
<li><code>find</code></li>
|
@@ -900,9 +904,17 @@ via <code>ssh-copy-id</code> to the inspected host, e.g.: <code>ssh-copy-id root
|
|
900
904
|
</ul>
|
901
905
|
</li>
|
902
906
|
<li><p>When inspecting as non-root the user has to have the following command
|
903
|
-
whitelist given in the sudoers file
|
907
|
+
whitelist given in the sudoers file.</p>
|
904
908
|
|
905
|
-
<
|
909
|
+
<dl>
|
910
|
+
<dt>On rpm based systems, like SUSE or Red Hat:</dt><dd><p></p>
|
911
|
+
|
912
|
+
<p>machinery ALL=(ALL) NOPASSWD: /usr/bin/find,/usr/bin/cat,/bin/cat,/usr/bin/rsync,/bin/rpm -Va *,/bin/tar --create *,/usr/bin/stat</p></dd>
|
913
|
+
<dt>On dpkg based systems, like Debian or Ubuntu:</dt><dd><p></p>
|
914
|
+
|
915
|
+
<p>machinery ALL=(ALL) NOPASSWD: /usr/bin/find,/usr/bin/cat,/bin/cat,/usr/bin/rsync,/bin/tar --create *,/usr/bin/stat,/usr/bin/dpkg,/bin/readlink</p></dd>
|
916
|
+
</dl>
|
917
|
+
</li>
|
906
918
|
<li><p>To add a remote <code>machinery</code> user run as root:</p>
|
907
919
|
|
908
920
|
<h1><code>useradd -m machinery -c "remote user for machinery"</code></h1>
|
@@ -1006,10 +1018,9 @@ by adding an '@' before the path, e.g.</p>
|
|
1006
1018
|
<li><p>The image to be inspected needs to have the following commands:</p>
|
1007
1019
|
|
1008
1020
|
<ul>
|
1009
|
-
<li><code>rpm</code></li>
|
1010
|
-
<li><code>zypper</code> or <code>
|
1021
|
+
<li><code>rpm</code> or <code>dpkg</code></li>
|
1022
|
+
<li><code>zypper</code>, <code>yum</code> or <code>apt-cache</code></li>
|
1011
1023
|
<li><code>rsync</code></li>
|
1012
|
-
<li><code>chkconfig</code></li>
|
1013
1024
|
<li><code>cat</code></li>
|
1014
1025
|
<li><code>sed</code></li>
|
1015
1026
|
<li><code>find</code></li>
|
@@ -55,21 +55,21 @@ class ChangedManagedFilesInspector < Inspector
|
|
55
55
|
end
|
56
56
|
|
57
57
|
scope.extracted = !!options[:extract_changed_managed_files]
|
58
|
-
scope
|
58
|
+
scope += result.sort_by(&:name)
|
59
59
|
|
60
60
|
@description["changed_managed_files"] = scope
|
61
61
|
end
|
62
62
|
|
63
63
|
def summary
|
64
64
|
"#{@description.changed_managed_files.extracted ? "Extracted" : "Found"} " +
|
65
|
-
"#{@description.changed_managed_files.
|
65
|
+
"#{@description.changed_managed_files.count} changed files."
|
66
66
|
end
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
70
|
def changed_files
|
71
71
|
count = 0
|
72
|
-
files = @system.
|
72
|
+
files = @system.managed_files_database.changed_files do |chunk|
|
73
73
|
count += chunk.lines.reject { |l| l.chomp.end_with?(":") || l.split(" ")[1] == "c" }.count
|
74
74
|
Machinery::Ui.progress(" -> Found #{count} changed #{Machinery::pluralize(count, "file")}...")
|
75
75
|
end
|
@@ -19,8 +19,8 @@ class ChangedManagedFilesRenderer < Renderer
|
|
19
19
|
def content(description)
|
20
20
|
return unless description["changed_managed_files"]
|
21
21
|
|
22
|
-
if description["changed_managed_files"]
|
23
|
-
files, errors = description["changed_managed_files"].
|
22
|
+
if description["changed_managed_files"]
|
23
|
+
files, errors = description["changed_managed_files"].partition do |file|
|
24
24
|
file.status != "error"
|
25
25
|
end
|
26
26
|
end
|
data/plugins/changed_managed_files/schema/system-description-changed-managed-files.schema-v6.json
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
3
|
+
|
4
|
+
"type": "object",
|
5
|
+
"required": [
|
6
|
+
"_elements"
|
7
|
+
],
|
8
|
+
"properties": {
|
9
|
+
"_attributes": {
|
10
|
+
"type": "object",
|
11
|
+
"required": [
|
12
|
+
"extracted"
|
13
|
+
],
|
14
|
+
"properties": {
|
15
|
+
"extracted": {
|
16
|
+
"type": "boolean"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
"_elements": {
|
21
|
+
"type": "array",
|
22
|
+
"items": {
|
23
|
+
"type": "object",
|
24
|
+
"required": [
|
25
|
+
"name",
|
26
|
+
"package_name",
|
27
|
+
"package_version"
|
28
|
+
],
|
29
|
+
"properties": {
|
30
|
+
"name": {
|
31
|
+
"type": "string"
|
32
|
+
},
|
33
|
+
"package_name": {
|
34
|
+
"type": "string",
|
35
|
+
"minLength": 1
|
36
|
+
},
|
37
|
+
"package_version": {
|
38
|
+
"type": "string",
|
39
|
+
"minLength": 1
|
40
|
+
}
|
41
|
+
},
|
42
|
+
"oneOf": [
|
43
|
+
{
|
44
|
+
"$ref": "#/definitions/file_changed"
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"$ref": "#/definitions/file_error"
|
48
|
+
}
|
49
|
+
]
|
50
|
+
}
|
51
|
+
}
|
52
|
+
},
|
53
|
+
"definitions": {
|
54
|
+
"file_changed": {
|
55
|
+
"required": ["status"],
|
56
|
+
"properties": {
|
57
|
+
"status": {
|
58
|
+
"enum": ["changed"]
|
59
|
+
}
|
60
|
+
},
|
61
|
+
"oneOf": [
|
62
|
+
{ "$ref": "#/definitions/file_changed_modified" },
|
63
|
+
{ "$ref": "#/definitions/link_changed_modified" },
|
64
|
+
{ "$ref": "#/definitions/file_changed_deleted" }
|
65
|
+
]
|
66
|
+
},
|
67
|
+
"file_changed_modified": {
|
68
|
+
"required": ["changes", "mode", "user", "group", "type"],
|
69
|
+
"properties": {
|
70
|
+
"changes": {
|
71
|
+
"type": "array",
|
72
|
+
"items": {
|
73
|
+
"enum": [
|
74
|
+
"size",
|
75
|
+
"mode",
|
76
|
+
"md5",
|
77
|
+
"device_number",
|
78
|
+
"link_path",
|
79
|
+
"user",
|
80
|
+
"group",
|
81
|
+
"time",
|
82
|
+
"capabilities",
|
83
|
+
"replaced",
|
84
|
+
"other_rpm_changes"
|
85
|
+
]
|
86
|
+
},
|
87
|
+
"minItems": 1
|
88
|
+
},
|
89
|
+
"mode": {
|
90
|
+
"type": "string",
|
91
|
+
"pattern": "^[0-7]{3,4}$"
|
92
|
+
},
|
93
|
+
"user": {
|
94
|
+
"type": "string",
|
95
|
+
"minLength": 1
|
96
|
+
},
|
97
|
+
"group": {
|
98
|
+
"type": "string",
|
99
|
+
"minLength": 1
|
100
|
+
},
|
101
|
+
"type": {
|
102
|
+
"enum": ["file", "dir"]
|
103
|
+
}
|
104
|
+
}
|
105
|
+
},
|
106
|
+
"link_changed_modified": {
|
107
|
+
"required": ["target", "changes", "mode", "user", "group", "type"],
|
108
|
+
"properties": {
|
109
|
+
"changes": {
|
110
|
+
"type": "array",
|
111
|
+
"items": {
|
112
|
+
"enum": [
|
113
|
+
"size",
|
114
|
+
"mode",
|
115
|
+
"md5",
|
116
|
+
"device_number",
|
117
|
+
"link_path",
|
118
|
+
"user",
|
119
|
+
"group",
|
120
|
+
"time",
|
121
|
+
"capabilities",
|
122
|
+
"replaced",
|
123
|
+
"other_rpm_changes"
|
124
|
+
]
|
125
|
+
},
|
126
|
+
"minItems": 1
|
127
|
+
},
|
128
|
+
"mode": {
|
129
|
+
"type": "string",
|
130
|
+
"pattern": "^[0-7]{3,4}$"
|
131
|
+
},
|
132
|
+
"user": {
|
133
|
+
"type": "string",
|
134
|
+
"minLength": 1
|
135
|
+
},
|
136
|
+
"group": {
|
137
|
+
"type": "string",
|
138
|
+
"minLength": 1
|
139
|
+
},
|
140
|
+
"type": {
|
141
|
+
"enum": ["link"]
|
142
|
+
},
|
143
|
+
"target": {
|
144
|
+
"type": "string"
|
145
|
+
}
|
146
|
+
}
|
147
|
+
},
|
148
|
+
"file_changed_deleted": {
|
149
|
+
"required": ["changes"],
|
150
|
+
"properties": {
|
151
|
+
"changes": {
|
152
|
+
"enum": [["deleted"]]
|
153
|
+
}
|
154
|
+
}
|
155
|
+
},
|
156
|
+
"file_error": {
|
157
|
+
"required": ["status", "error_message"],
|
158
|
+
"properties": {
|
159
|
+
"status": {
|
160
|
+
"enum": ["error"]
|
161
|
+
},
|
162
|
+
"error_message": {
|
163
|
+
"type": "string"
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
@@ -41,7 +41,7 @@ class ConfigFilesInspector < Inspector
|
|
41
41
|
system.check_retrieve_files_dependencies if do_extract
|
42
42
|
|
43
43
|
count = 0
|
44
|
-
files = @system.
|
44
|
+
files = @system.managed_files_database.changed_files do |chunk|
|
45
45
|
count += chunk.lines.count { |l| !l.chomp.end_with?(":") && l.split(" ")[1] == "c" }
|
46
46
|
Machinery::Ui.progress(" -> Found #{count} config #{Machinery::pluralize(count, "file")}...")
|
47
47
|
end
|
@@ -62,20 +62,20 @@ class ConfigFilesInspector < Inspector
|
|
62
62
|
if do_extract
|
63
63
|
file_store.create
|
64
64
|
extracted_paths = result.reject do |file|
|
65
|
-
file.changes ==
|
65
|
+
file.changes == ["deleted"] ||
|
66
66
|
file.link? || file.directory?
|
67
67
|
end.map(&:name)
|
68
68
|
scope.retrieve_files_from_system(@system, extracted_paths)
|
69
69
|
end
|
70
70
|
|
71
71
|
scope.extracted = !!do_extract
|
72
|
-
scope
|
72
|
+
scope += result.sort_by(&:name)
|
73
73
|
|
74
74
|
@description["config_files"] = scope
|
75
75
|
end
|
76
76
|
|
77
77
|
def summary
|
78
78
|
"#{@description.config_files.extracted ? "Extracted" : "Found"} " +
|
79
|
-
"#{@description.config_files.
|
79
|
+
"#{@description.config_files.count} changed configuration files."
|
80
80
|
end
|
81
81
|
end
|
@@ -31,9 +31,9 @@ class ConfigFilesRenderer < Renderer
|
|
31
31
|
|
32
32
|
list do
|
33
33
|
file_status = description["config_files"].extracted
|
34
|
-
files = description["config_files"]
|
34
|
+
files = description["config_files"]
|
35
35
|
|
36
|
-
if files.empty?
|
36
|
+
if files.elements.empty?
|
37
37
|
puts "There are no config files."
|
38
38
|
elsif !file_status.nil?
|
39
39
|
puts "Files extracted: #{file_status ? "yes" : "no"}"
|
@@ -0,0 +1,160 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
3
|
+
|
4
|
+
"type": "object",
|
5
|
+
"required": [
|
6
|
+
"_elements"
|
7
|
+
],
|
8
|
+
"properties": {
|
9
|
+
"_attributes": {
|
10
|
+
"type": "object",
|
11
|
+
"required": [
|
12
|
+
"extracted"
|
13
|
+
],
|
14
|
+
"properties": {
|
15
|
+
"extracted": {
|
16
|
+
"type": "boolean"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
"_elements": {
|
21
|
+
"type": "array",
|
22
|
+
"items" : {
|
23
|
+
"type": "object",
|
24
|
+
"required": ["name", "package_name", "package_version"],
|
25
|
+
"properties": {
|
26
|
+
"name": {
|
27
|
+
"type": "string"
|
28
|
+
},
|
29
|
+
"package_name": {
|
30
|
+
"type": "string",
|
31
|
+
"minLength": 1
|
32
|
+
},
|
33
|
+
"package_version": {
|
34
|
+
"type": "string",
|
35
|
+
"minLength": 1
|
36
|
+
}
|
37
|
+
},
|
38
|
+
"oneOf": [
|
39
|
+
{ "$ref": "#/definitions/file_changed" },
|
40
|
+
{ "$ref": "#/definitions/file_error" }
|
41
|
+
]
|
42
|
+
}
|
43
|
+
}
|
44
|
+
},
|
45
|
+
"definitions": {
|
46
|
+
"file_changed": {
|
47
|
+
"required": ["status"],
|
48
|
+
"properties": {
|
49
|
+
"status": {
|
50
|
+
"enum": ["changed"]
|
51
|
+
}
|
52
|
+
},
|
53
|
+
"oneOf": [
|
54
|
+
{ "$ref": "#/definitions/file_changed_modified" },
|
55
|
+
{ "$ref": "#/definitions/link_changed_modified" },
|
56
|
+
{ "$ref": "#/definitions/file_changed_deleted" }
|
57
|
+
]
|
58
|
+
},
|
59
|
+
"file_changed_modified": {
|
60
|
+
"required": ["changes", "mode", "user", "group", "type"],
|
61
|
+
"properties": {
|
62
|
+
"changes": {
|
63
|
+
"type": "array",
|
64
|
+
"items": {
|
65
|
+
"enum": [
|
66
|
+
"size",
|
67
|
+
"mode",
|
68
|
+
"md5",
|
69
|
+
"device_number",
|
70
|
+
"link_path",
|
71
|
+
"user",
|
72
|
+
"group",
|
73
|
+
"time",
|
74
|
+
"capabilities",
|
75
|
+
"replaced",
|
76
|
+
"other_rpm_changes"
|
77
|
+
]
|
78
|
+
},
|
79
|
+
"minItems": 1
|
80
|
+
},
|
81
|
+
"mode": {
|
82
|
+
"type": "string",
|
83
|
+
"pattern": "^[0-7]{3,4}$"
|
84
|
+
},
|
85
|
+
"user": {
|
86
|
+
"type": "string",
|
87
|
+
"minLength": 1
|
88
|
+
},
|
89
|
+
"group": {
|
90
|
+
"type": "string",
|
91
|
+
"minLength": 1
|
92
|
+
},
|
93
|
+
"type": {
|
94
|
+
"enum": ["file", "dir"]
|
95
|
+
}
|
96
|
+
}
|
97
|
+
},
|
98
|
+
"link_changed_modified": {
|
99
|
+
"required": ["target", "changes", "mode", "user", "group", "type"],
|
100
|
+
"properties": {
|
101
|
+
"changes": {
|
102
|
+
"type": "array",
|
103
|
+
"items": {
|
104
|
+
"enum": [
|
105
|
+
"size",
|
106
|
+
"mode",
|
107
|
+
"md5",
|
108
|
+
"device_number",
|
109
|
+
"link_path",
|
110
|
+
"user",
|
111
|
+
"group",
|
112
|
+
"time",
|
113
|
+
"capabilities",
|
114
|
+
"replaced",
|
115
|
+
"other_rpm_changes"
|
116
|
+
]
|
117
|
+
},
|
118
|
+
"minItems": 1
|
119
|
+
},
|
120
|
+
"mode": {
|
121
|
+
"type": "string",
|
122
|
+
"pattern": "^[0-7]{3,4}$"
|
123
|
+
},
|
124
|
+
"user": {
|
125
|
+
"type": "string",
|
126
|
+
"minLength": 1
|
127
|
+
},
|
128
|
+
"group": {
|
129
|
+
"type": "string",
|
130
|
+
"minLength": 1
|
131
|
+
},
|
132
|
+
"type": {
|
133
|
+
"enum": ["link"]
|
134
|
+
},
|
135
|
+
"target": {
|
136
|
+
"type": "string"
|
137
|
+
}
|
138
|
+
}
|
139
|
+
},
|
140
|
+
"file_changed_deleted": {
|
141
|
+
"required": ["changes"],
|
142
|
+
"properties": {
|
143
|
+
"changes": {
|
144
|
+
"enum": [["deleted"]]
|
145
|
+
}
|
146
|
+
}
|
147
|
+
},
|
148
|
+
"file_error": {
|
149
|
+
"required": ["status", "error_message"],
|
150
|
+
"properties": {
|
151
|
+
"status": {
|
152
|
+
"enum": ["error"]
|
153
|
+
},
|
154
|
+
"error_message": {
|
155
|
+
"type": "string"
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
}
|
160
|
+
}
|