@@ -35,8 +35,6 @@ class RemoteDirectory < Chef::Provider::Directory
35
35
36
36
def action_create
37
37
super
38
-
39
- @remote_file_list = Hash . new
40
38
do_recursive
41
39
end
42
40
@@ -45,81 +43,92 @@ def action_create
45
43
def do_recursive
46
44
if Chef ::Config [ :solo ]
47
45
Chef ::Log . debug ( "Doing a local recursive directory copy for #{ @new_resource } " )
48
- files_to_transfer = files_for_directory ( @new_resource . source )
49
46
else
50
47
Chef ::Log . debug ( "Doing a remote recursive directory transfer for #{ @new_resource } " )
51
- r = Chef ::REST . new ( Chef ::Config [ :remotefile_url ] )
52
- files_to_transfer = r . get_rest ( generate_url ( @new_resource . source , "files" , { :recursive => "true" } ) )
53
- end
54
-
48
+ end
49
+
55
50
files_to_transfer . each do |remote_file_source |
56
51
fetch_remote_file ( remote_file_source )
57
52
end
58
53
end
59
54
55
+ def files_to_transfer
56
+ file_list = Chef ::Config [ :solo ] ? generate_solo_file_list : generate_client_file_list
57
+ Chef ::Log . debug ( "Generated file manifest for #{ @new_resource } :\n #{ file_list . join ( "\n " ) } " )
58
+ file_list
59
+ end
60
+
61
+ def generate_solo_file_list
62
+ # Pulled from chef-server-slice files controller
63
+ directory = find_preferred_file (
64
+ @new_resource . cookbook_name ,
65
+ :remote_file ,
66
+ @new_resource . source ,
67
+ @node [ :fqdn ] ,
68
+ @node [ :platform ] ,
69
+ @node [ :platform_version ]
70
+ )
71
+
72
+ unless ( directory && ::File . directory? ( directory ) )
73
+ raise NotFound , "Cannot find a suitable directory"
74
+ end
75
+
76
+ Dir [ ::File . join ( directory , '**' , '*' ) ] . sort . reverse . select do |file |
77
+ file [ /^#{ directory } \/ (.+)$/ , 1 ] unless ::File . directory? ( file )
78
+ end
79
+ end
80
+
81
+ def generate_client_file_list
82
+ r = Chef ::REST . new ( Chef ::Config [ :remotefile_url ] )
83
+ r . get_rest ( generate_url ( @new_resource . source , "files" , { :recursive => "true" } ) )
84
+ end
85
+
60
86
def fetch_remote_file ( remote_file_source )
61
87
full_path = ::File . join ( @new_resource . path , remote_file_source )
62
- full_dir = ::File . dirname ( full_path )
63
88
64
- if !::File . directory? ( full_dir )
65
- create_directory ( full_dir )
66
- end
67
-
68
- remote_file = Chef ::Resource ::RemoteFile . new ( full_path , nil , @node )
69
- remote_file . cookbook_name = @new_resource . cookbook || @new_resource . cookbook_name
70
- remote_file . source ( ::File . join ( @new_resource . source , remote_file_source ) )
89
+ ensure_directory_exists ( ::File . dirname ( full_path ) )
90
+
91
+ file_to_fetch = provider_for_remote_file ( full_path , remote_file_source )
92
+ file_to_fetch . load_current_resource
93
+ file_to_fetch . action_create
94
+ @new_resource . updated = true if file_to_fetch . new_resource . updated
95
+ end
96
+
97
+ def provider_for_remote_file ( path , source )
98
+ remote_file = Chef ::Resource ::RemoteFile . new ( path , nil , @node )
99
+ remote_file . cookbook_name = @new_resource . cookbook || @new_resource . cookbook_name
100
+ remote_file . source ( ::File . join ( @new_resource . source , source ) )
71
101
remote_file . mode ( @new_resource . files_mode ) if @new_resource . files_mode
72
102
remote_file . group ( @new_resource . files_group ) if @new_resource . files_group
73
103
remote_file . owner ( @new_resource . files_owner ) if @new_resource . files_owner
74
104
remote_file . backup ( @new_resource . files_backup ) if @new_resource . files_backup
75
105
76
- rf_provider = Chef ::Platform . provider_for_node ( @node , remote_file )
77
- rf_provider . load_current_resource
78
- rf_provider . action_create
79
- @new_resource . updated = true if rf_provider . new_resource . updated
106
+ Chef ::Platform . provider_for_node ( @node , remote_file )
80
107
end
81
108
82
- def create_directory ( full_dir )
83
- new_dir = Chef ::Resource ::Directory . new ( full_dir , nil , @node )
109
+ def ensure_directory_exists ( path )
110
+ unless ::File . directory? ( path )
111
+ directory_to_create = provider_for_directory ( path )
112
+ directory_to_create . load_current_resource
113
+ directory_to_create . action_create
114
+ @new_resource . updated = true if directory_to_create . new_resource . updated
115
+ end
116
+ end
117
+
118
+ def provider_for_directory ( path )
119
+ new_dir = Chef ::Resource ::Directory . new ( path , nil , @node )
84
120
new_dir . cookbook_name = @new_resource . cookbook || @new_resource . cookbook_name
85
121
new_dir . mode ( @new_resource . mode )
86
122
new_dir . group ( @new_resource . group )
87
123
new_dir . owner ( @new_resource . owner )
88
124
new_dir . recursive ( true )
89
125
90
- d_provider = Chef ::Platform . provider_for_node ( @node , new_dir )
91
- d_provider . load_current_resource
92
- d_provider . action_create
93
- @new_resource . updated = true if d_provider . new_resource . updated
126
+ Chef ::Platform . provider_for_node ( @node , new_dir )
94
127
end
95
128
96
129
def action_create_if_missing
97
130
raise Chef ::Exceptions ::UnsupportedAction , "Remote Directories do not support create_if_missing."
98
131
end
99
- # Pulled from chef-server-slice files controller
100
-
101
- def files_for_directory ( path )
102
- directory = find_preferred_file (
103
- @new_resource . cookbook_name ,
104
- :remote_file ,
105
- path ,
106
- @node [ :fqdn ] ,
107
- @node [ :platform ] ,
108
- @node [ :platform_version ]
109
- )
110
-
111
- unless ( directory && ::File . directory? ( directory ) )
112
- raise NotFound , "Cannot find a suitable directory"
113
- end
114
-
115
- directory_listing = Array . new
116
- Dir [ ::File . join ( directory , '**' , '*' ) ] . sort { |a , b | b <=> a } . each do |file |
117
- next if ::File . directory? ( file )
118
- file =~ /^#{ directory } \/ (.+)$/
119
- directory_listing << $1
120
- end
121
- directory_listing
122
- end
123
132
124
133
end
125
134
end
0 commit comments