right_link 5.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. data/actors/agent_manager.rb +88 -0
  2. data/actors/instance_scheduler.rb +321 -0
  3. data/actors/instance_services.rb +64 -0
  4. data/actors/instance_setup.rb +567 -0
  5. data/bin/cloud +25 -0
  6. data/bin/cook_runner +44 -0
  7. data/bin/deploy +120 -0
  8. data/bin/enroll +385 -0
  9. data/bin/rad +32 -0
  10. data/bin/rchk +29 -0
  11. data/bin/rnac +39 -0
  12. data/bin/rs_connect +33 -0
  13. data/bin/rs_log_level +31 -0
  14. data/bin/rs_ohai +28 -0
  15. data/bin/rs_reenroll +31 -0
  16. data/bin/rs_run_recipe +34 -0
  17. data/bin/rs_run_right_script +34 -0
  18. data/bin/rs_shutdown +33 -0
  19. data/bin/rs_tag +33 -0
  20. data/bin/rs_thunk +33 -0
  21. data/bin/rstat +31 -0
  22. data/bin/system +16 -0
  23. data/ext/Rakefile +18 -0
  24. data/init/config.yml +5 -0
  25. data/init/init.rb +79 -0
  26. data/lib/chef/ohai_setup.rb +51 -0
  27. data/lib/chef/plugins/cloud.rb +91 -0
  28. data/lib/chef/plugins/cloudstack.rb +23 -0
  29. data/lib/chef/plugins/ec2.rb +23 -0
  30. data/lib/chef/plugins/linux/block_device2.rb +24 -0
  31. data/lib/chef/plugins/rackspace.rb +23 -0
  32. data/lib/chef/plugins/rightscale.rb +125 -0
  33. data/lib/chef/plugins/windows/network.rb +114 -0
  34. data/lib/chef/plugins.rb +74 -0
  35. data/lib/chef/providers/dns_dnsmadeeasy_provider.rb +81 -0
  36. data/lib/chef/providers/dns_resource.rb +100 -0
  37. data/lib/chef/providers/executable_schedule_provider.rb +70 -0
  38. data/lib/chef/providers/executable_schedule_resource.rb +144 -0
  39. data/lib/chef/providers/remote_recipe_provider.rb +86 -0
  40. data/lib/chef/providers/remote_recipe_resource.rb +101 -0
  41. data/lib/chef/providers/right_link_tag_provider.rb +73 -0
  42. data/lib/chef/providers/right_link_tag_resource.rb +59 -0
  43. data/lib/chef/providers/right_script_provider.rb +190 -0
  44. data/lib/chef/providers/right_script_resource.rb +113 -0
  45. data/lib/chef/providers/rs_shutdown_provider.rb +75 -0
  46. data/lib/chef/providers/rs_shutdown_resource.rb +55 -0
  47. data/lib/chef/providers/server_collection_provider.rb +66 -0
  48. data/lib/chef/providers/server_collection_resource.rb +93 -0
  49. data/lib/chef/providers/windows/powershell_provider.rb +151 -0
  50. data/lib/chef/providers/windows/powershell_resource.rb +111 -0
  51. data/lib/chef/providers/windows/unsupported_provider.rb +51 -0
  52. data/lib/chef/right_providers.rb +55 -0
  53. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/ChefNodeCmdlet.csproj +104 -0
  54. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/ChefNodeCmdlet.dll-Help.xml +141 -0
  55. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/Exceptions.cs +182 -0
  56. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetChefNodeCommand.cs +58 -0
  57. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetChefNodeRequest.cs +46 -0
  58. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetChefNodeResponse.cs +45 -0
  59. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetCurrentResourceCommand.cs +58 -0
  60. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetCurrentResourceRequest.cs +46 -0
  61. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetCurrentResourceResponse.cs +45 -0
  62. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNewResourceCommand.cs +58 -0
  63. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNewResourceRequest.cs +46 -0
  64. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNewResourceResponse.cs +45 -0
  65. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNextActionCommand.cs +178 -0
  66. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNextActionRequest.cs +67 -0
  67. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNextActionResponse.cs +58 -0
  68. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNodeValueCommandBase.cs +142 -0
  69. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNodeValueRequestBase.cs +64 -0
  70. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/GetNodeValueResponseBase.cs +69 -0
  71. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/JsonTransport.cs +110 -0
  72. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/PipeClient.cs +158 -0
  73. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/PipeServer.cs +142 -0
  74. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/Properties/AssemblyInfo.cs +16 -0
  75. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/ProtocolConstants.cs +55 -0
  76. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/ProtocolUtilities.cs +77 -0
  77. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/ReadMe.txt +53 -0
  78. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetChefNodeCommand.cs +59 -0
  79. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetChefNodeRequest.cs +46 -0
  80. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetChefNodeResponse.cs +58 -0
  81. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetCurrentResourceCommand.cs +59 -0
  82. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetCurrentResourceRequest.cs +46 -0
  83. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetCurrentResourceResponse.cs +40 -0
  84. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNewResourceCommand.cs +59 -0
  85. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNewResourceRequest.cs +46 -0
  86. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNewResourceResponse.cs +40 -0
  87. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNodeValueCommandBase.cs +293 -0
  88. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNodeValueRequestBase.cs +75 -0
  89. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/SetNodeValueResponseBase.cs +45 -0
  90. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet/Transport.cs +91 -0
  91. data/lib/chef/windows/ChefNodeCmdlet/ChefNodeCmdlet.sln +35 -0
  92. data/lib/chef/windows/ChefNodeCmdlet/TestChefNodeCmdlet/Program.cs +374 -0
  93. data/lib/chef/windows/ChefNodeCmdlet/TestChefNodeCmdlet/Properties/AssemblyInfo.cs +16 -0
  94. data/lib/chef/windows/ChefNodeCmdlet/TestChefNodeCmdlet/TestChefNodeCmdlet.csproj +65 -0
  95. data/lib/chef/windows/ChefNodeCmdlet/TestNextActionCmdlet/Program.cs +136 -0
  96. data/lib/chef/windows/ChefNodeCmdlet/TestNextActionCmdlet/Properties/AssemblyInfo.cs +36 -0
  97. data/lib/chef/windows/ChefNodeCmdlet/TestNextActionCmdlet/ReadMe.txt +46 -0
  98. data/lib/chef/windows/ChefNodeCmdlet/TestNextActionCmdlet/TestNextActionCmdlet.csproj +68 -0
  99. data/lib/chef/windows/bin/Newtonsoft.Json.dll +0 -0
  100. data/lib/chef/windows/chef_node_server.rb +463 -0
  101. data/lib/chef/windows/dynamic_powershell_provider.rb +296 -0
  102. data/lib/chef/windows/pipe_server.rb +283 -0
  103. data/lib/chef/windows/powershell_host.rb +285 -0
  104. data/lib/chef/windows/powershell_pipe_server.rb +136 -0
  105. data/lib/chef/windows/powershell_provider_base.rb +92 -0
  106. data/lib/chef/windows/scripts/run_loop.ps1 +105 -0
  107. data/lib/clouds/cloud.rb +557 -0
  108. data/lib/clouds/cloud_factory.rb +250 -0
  109. data/lib/clouds/cloud_utilities.rb +244 -0
  110. data/lib/clouds/clouds/azure.rb +106 -0
  111. data/lib/clouds/clouds/cloudstack.rb +114 -0
  112. data/lib/clouds/clouds/ec2.rb +113 -0
  113. data/lib/clouds/clouds/eucalyptus.rb +46 -0
  114. data/lib/clouds/clouds/google.rb +102 -0
  115. data/lib/clouds/clouds/none.rb +76 -0
  116. data/lib/clouds/clouds/openstack.rb +30 -0
  117. data/lib/clouds/clouds/rackspace-ng.rb +54 -0
  118. data/lib/clouds/clouds/rackspace.rb +78 -0
  119. data/lib/clouds/clouds/softlayer.rb +91 -0
  120. data/lib/clouds/metadata_formatter.rb +108 -0
  121. data/lib/clouds/metadata_provider.rb +128 -0
  122. data/lib/clouds/metadata_source.rb +87 -0
  123. data/lib/clouds/metadata_sources/certificate_metadata_source.rb +207 -0
  124. data/lib/clouds/metadata_sources/config_drive_metadata_source.rb +129 -0
  125. data/lib/clouds/metadata_sources/file_metadata_source.rb +74 -0
  126. data/lib/clouds/metadata_sources/http_metadata_source.rb +277 -0
  127. data/lib/clouds/metadata_sources/selective_metadata_source.rb +122 -0
  128. data/lib/clouds/metadata_tree_climber.rb +144 -0
  129. data/lib/clouds/metadata_writer.rb +155 -0
  130. data/lib/clouds/metadata_writers/dictionary_metadata_writer.rb +72 -0
  131. data/lib/clouds/metadata_writers/ruby_metadata_writer.rb +76 -0
  132. data/lib/clouds/metadata_writers/shell_metadata_writer.rb +121 -0
  133. data/lib/clouds/register_clouds.rb +34 -0
  134. data/lib/clouds.rb +32 -0
  135. data/lib/gem_dependencies.rb +83 -0
  136. data/lib/git_hooks/commit-msg.rb +7 -0
  137. data/lib/instance/agent_config.rb +168 -0
  138. data/lib/instance/agent_watcher.rb +233 -0
  139. data/lib/instance/audit_cook_stub.rb +104 -0
  140. data/lib/instance/audit_proxy.rb +247 -0
  141. data/lib/instance/bundle_queue.rb +104 -0
  142. data/lib/instance/cook/agent_connection.rb +109 -0
  143. data/lib/instance/cook/audit_logger.rb +165 -0
  144. data/lib/instance/cook/audit_stub.rb +142 -0
  145. data/lib/instance/cook/ca-bundle.crt +2794 -0
  146. data/lib/instance/cook/chef_state.rb +211 -0
  147. data/lib/instance/cook/cook.rb +306 -0
  148. data/lib/instance/cook/cook_state.rb +298 -0
  149. data/lib/instance/cook/cookbook_path_mapping.rb +66 -0
  150. data/lib/instance/cook/cookbook_repo_retriever.rb +190 -0
  151. data/lib/instance/cook/executable_sequence.rb +765 -0
  152. data/lib/instance/cook/external_parameter_gatherer.rb +190 -0
  153. data/lib/instance/cook/repose_downloader.rb +349 -0
  154. data/lib/instance/cook/shutdown_request_proxy.rb +121 -0
  155. data/lib/instance/cook.rb +41 -0
  156. data/lib/instance/downloader.rb +208 -0
  157. data/lib/instance/duplicable.rb +67 -0
  158. data/lib/instance/exceptions.rb +49 -0
  159. data/lib/instance/executable_sequence_proxy.rb +278 -0
  160. data/lib/instance/instance_commands.rb +577 -0
  161. data/lib/instance/instance_state.rb +633 -0
  162. data/lib/instance/json_utilities.rb +102 -0
  163. data/lib/instance/login_manager.rb +533 -0
  164. data/lib/instance/login_user_manager.rb +522 -0
  165. data/lib/instance/message_encoder.rb +118 -0
  166. data/lib/instance/multi_thread_bundle_queue.rb +232 -0
  167. data/lib/instance/operation_context.rb +60 -0
  168. data/lib/instance/options_bag.rb +65 -0
  169. data/lib/instance/payload_formatter.rb +46 -0
  170. data/lib/instance/policy.rb +53 -0
  171. data/lib/instance/policy_audit.rb +100 -0
  172. data/lib/instance/policy_manager.rb +146 -0
  173. data/lib/instance/reenroll_manager.rb +104 -0
  174. data/lib/instance/right_scripts_cookbook.rb +181 -0
  175. data/lib/instance/shutdown_request.rb +221 -0
  176. data/lib/instance/single_thread_bundle_queue.rb +189 -0
  177. data/lib/instance/volume_management.rb +450 -0
  178. data/lib/instance.rb +50 -0
  179. data/lib/repo_conf_generators/apt_conf_generators.rb +106 -0
  180. data/lib/repo_conf_generators/gem_conf_generators.rb +80 -0
  181. data/lib/repo_conf_generators/rightscale_conf_generators.rb +254 -0
  182. data/lib/repo_conf_generators/rightscale_key.pub +17 -0
  183. data/lib/repo_conf_generators/yum_conf_generators.rb +225 -0
  184. data/lib/repo_conf_generators.rb +30 -0
  185. data/lib/run_shell.rb +28 -0
  186. data/scripts/agent_checker.rb +571 -0
  187. data/scripts/agent_controller.rb +247 -0
  188. data/scripts/agent_deployer.rb +148 -0
  189. data/scripts/bundle_runner.rb +336 -0
  190. data/scripts/cloud_controller.rb +176 -0
  191. data/scripts/log_level_manager.rb +142 -0
  192. data/scripts/ohai_runner.rb +33 -0
  193. data/scripts/reenroller.rb +193 -0
  194. data/scripts/server_importer.rb +293 -0
  195. data/scripts/shutdown_client.rb +183 -0
  196. data/scripts/system_configurator.rb +367 -0
  197. data/scripts/tagger.rb +381 -0
  198. data/scripts/thunker.rb +356 -0
  199. metadata +418 -0
@@ -0,0 +1,142 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ // Copyright (c) 2010-2011 RightScale Inc
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining
5
+ // a copy of this software and associated documentation files (the
6
+ // "Software"), to deal in the Software without restriction, including
7
+ // without limitation the rights to use, copy, modify, merge, publish,
8
+ // distribute, sublicense, and/or sell copies of the Software, and to
9
+ // permit persons to whom the Software is furnished to do so, subject to
10
+ // the following conditions:
11
+ //
12
+ // The above copyright notice and this permission notice shall be
13
+ // included in all copies or substantial portions of the Software.
14
+ //
15
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ /////////////////////////////////////////////////////////////////////////
23
+ using System;
24
+ using System.Collections;
25
+ using System.Management.Automation;
26
+ using System.Threading;
27
+ using RightScale.Common.Protocol;
28
+ using RightScale.Chef.Protocol;
29
+ using RightScale.Powershell.Exceptions;
30
+
31
+ namespace RightScale
32
+ {
33
+ namespace Powershell
34
+ {
35
+ namespace Commands
36
+ {
37
+ // Provides a base class for get node commands.
38
+ public abstract class GetNodeValueCommandBase : Cmdlet
39
+ {
40
+ // Path to distinguish child element being requested.
41
+ [Parameter(ValueFromPipeline = true, Position = 0)]
42
+ public string[] Path
43
+ {
44
+ get { return path; }
45
+ set { path = value; }
46
+ }
47
+
48
+ // Summary:
49
+ // Factory method for request from cmdlet parameters.
50
+ //
51
+ // Returns:
52
+ // request object
53
+ protected abstract GetNodeValueRequestBase CreateRequest();
54
+
55
+ // Summary:
56
+ // Factory method for exception from message.
57
+ //
58
+ // Returns:
59
+ // exception
60
+ protected abstract ChefNodeCmdletExceptionBase CreateException(string message);
61
+
62
+ // Summary:
63
+ // Factory method for exception from response hash.
64
+ //
65
+ // Returns:
66
+ // exception
67
+ protected abstract ChefNodeCmdletExceptionBase CreateException(IDictionary responseHash);
68
+
69
+ // Summary:
70
+ // implements required cmdlet processing method.
71
+ protected override void ProcessRecord()
72
+ {
73
+ // iterate attempting to connect, send and receive to Chef node server.
74
+ for (int tryIndex = 0; tryIndex < Constants.MAX_CLIENT_RETRIES; ++tryIndex)
75
+ {
76
+ ITransport transport = new JsonTransport();
77
+ PipeClient pipeClient = new PipeClient(Constants.CHEF_NODE_PIPE_NAME, transport);
78
+
79
+ try
80
+ {
81
+ GetNodeValueRequestBase request = CreateRequest();
82
+
83
+ pipeClient.Connect(Constants.CHEF_NODE_CONNECT_TIMEOUT_MSECS);
84
+
85
+ IDictionary responseHash = (IDictionary)transport.NormalizeDeserializedObject(pipeClient.SendReceive<object>(request));
86
+
87
+ if (null == responseHash)
88
+ {
89
+ if (tryIndex + 1 < Constants.MAX_CLIENT_RETRIES)
90
+ {
91
+ // delay retry a few ticks to yield time in case server is busy.
92
+ Thread.Sleep(Constants.SLEEP_BETWEEN_CLIENT_RETRIES_MSECS);
93
+ continue;
94
+ }
95
+ else
96
+ {
97
+ string message = String.Format("Failed to get expected response after {0} retries.", Constants.MAX_CLIENT_RETRIES);
98
+
99
+ throw CreateException(message);
100
+ }
101
+ }
102
+ if (ChefNodeCmdletExceptionBase.HasError(responseHash))
103
+ {
104
+ throw CreateException(responseHash);
105
+ }
106
+
107
+ // can't write a null object to pipeline, so write nothing in the null case.
108
+ object nodeValue = responseHash.Contains(Constants.JSON_NODE_VALUE_KEY) ? responseHash[Constants.JSON_NODE_VALUE_KEY] : null;
109
+
110
+ if (null != nodeValue)
111
+ {
112
+ WriteObject(nodeValue, nodeValue is ICollection);
113
+ }
114
+
115
+ // done.
116
+ break;
117
+ }
118
+ catch (TimeoutException e)
119
+ {
120
+ ThrowTerminatingError(new ErrorRecord(e, "Connection timed out", ErrorCategory.OperationTimeout, pipeClient));
121
+ }
122
+ catch (ChefNodeCmdletExceptionBase e)
123
+ {
124
+ ThrowTerminatingError(new ErrorRecord(e, "ChefNodeCmdlet exception", ErrorCategory.InvalidResult, pipeClient));
125
+ }
126
+ catch (Exception e)
127
+ {
128
+ ThrowTerminatingError(new ErrorRecord(e, "Unexpected exception", ErrorCategory.NotSpecified, pipeClient));
129
+ }
130
+ finally
131
+ {
132
+ pipeClient.Close();
133
+ pipeClient = null;
134
+ }
135
+ }
136
+ }
137
+
138
+ private string[] path;
139
+ }
140
+ }
141
+ }
142
+ }
@@ -0,0 +1,64 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ // Copyright (c) 2010-2011 RightScale Inc
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining
5
+ // a copy of this software and associated documentation files (the
6
+ // "Software"), to deal in the Software without restriction, including
7
+ // without limitation the rights to use, copy, modify, merge, publish,
8
+ // distribute, sublicense, and/or sell copies of the Software, and to
9
+ // permit persons to whom the Software is furnished to do so, subject to
10
+ // the following conditions:
11
+ //
12
+ // The above copyright notice and this permission notice shall be
13
+ // included in all copies or substantial portions of the Software.
14
+ //
15
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ /////////////////////////////////////////////////////////////////////////
23
+ using System;
24
+ using System.Collections;
25
+
26
+ namespace RightScale
27
+ {
28
+ namespace Chef
29
+ {
30
+ namespace Protocol
31
+ {
32
+ // Provides a base class for a get node request.
33
+ public abstract class GetNodeValueRequestBase
34
+ {
35
+ public string Command
36
+ {
37
+ get { return GetType().Name; }
38
+ }
39
+
40
+ public string[] Path
41
+ {
42
+ get { return path; }
43
+ set { path = value; }
44
+ }
45
+
46
+ public GetNodeValueRequestBase()
47
+ {
48
+ }
49
+
50
+ public GetNodeValueRequestBase(ICollection path)
51
+ {
52
+ this.path = Utilities.CollectionToStringArray(path);
53
+ }
54
+
55
+ public override string ToString()
56
+ {
57
+ return String.Format("{0}: {{ Path = node[{1}] }}", Command, String.Join("][", path));
58
+ }
59
+
60
+ private string[] path;
61
+ }
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,69 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ // Copyright (c) 2010-2011 RightScale Inc
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining
5
+ // a copy of this software and associated documentation files (the
6
+ // "Software"), to deal in the Software without restriction, including
7
+ // without limitation the rights to use, copy, modify, merge, publish,
8
+ // distribute, sublicense, and/or sell copies of the Software, and to
9
+ // permit persons to whom the Software is furnished to do so, subject to
10
+ // the following conditions:
11
+ //
12
+ // The above copyright notice and this permission notice shall be
13
+ // included in all copies or substantial portions of the Software.
14
+ //
15
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ /////////////////////////////////////////////////////////////////////////
23
+ using System;
24
+
25
+ namespace RightScale
26
+ {
27
+ namespace Chef
28
+ {
29
+ namespace Protocol
30
+ {
31
+ // Provides a base class for a get node response.
32
+ public abstract class GetNodeValueResponseBase
33
+ {
34
+ public string[] Path
35
+ {
36
+ get { return path; }
37
+ set { path = value; }
38
+ }
39
+
40
+ public object NodeValue
41
+ {
42
+ get { return nodeValue; }
43
+ set { nodeValue = value; }
44
+ }
45
+
46
+ public GetNodeValueResponseBase()
47
+ {
48
+ }
49
+
50
+ public GetNodeValueResponseBase(string[] path, object nodeValue)
51
+ {
52
+ this.path = path;
53
+ this.nodeValue = nodeValue;
54
+ }
55
+
56
+ public override string ToString()
57
+ {
58
+ return String.Format("{0}: {{ Path = node[{1}], NodeValue = {2} }}",
59
+ GetType().Name,
60
+ String.Join("][", path),
61
+ Utilities.GetPrettyNodeValue(NodeValue));
62
+ }
63
+
64
+ private string[] path;
65
+ private object nodeValue;
66
+ }
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,110 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ // Copyright (c) 2010-2011 RightScale Inc
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining
5
+ // a copy of this software and associated documentation files (the
6
+ // "Software"), to deal in the Software without restriction, including
7
+ // without limitation the rights to use, copy, modify, merge, publish,
8
+ // distribute, sublicense, and/or sell copies of the Software, and to
9
+ // permit persons to whom the Software is furnished to do so, subject to
10
+ // the following conditions:
11
+ //
12
+ // The above copyright notice and this permission notice shall be
13
+ // included in all copies or substantial portions of the Software.
14
+ //
15
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ /////////////////////////////////////////////////////////////////////////
23
+ using System;
24
+ using System.Collections;
25
+ using System.Collections.Generic;
26
+ using Newtonsoft.Json;
27
+ using Newtonsoft.Json.Linq;
28
+
29
+ namespace RightScale
30
+ {
31
+ namespace Common
32
+ {
33
+ namespace Protocol
34
+ {
35
+ // implements ITransport in terms of JSON serialization.
36
+ public class JsonTransport : ITransport
37
+ {
38
+ string ITransport.ConvertObjectToString(object data)
39
+ {
40
+ return JsonConvert.SerializeObject(data);
41
+ }
42
+
43
+ string ITransport.ConvertObjectToString(object data, bool pretty)
44
+ {
45
+ return JsonConvert.SerializeObject(data, pretty ? Formatting.Indented : Formatting.None);
46
+ }
47
+
48
+ T ITransport.ConvertStringToObject<T>(string data)
49
+ {
50
+ return JsonConvert.DeserializeObject<T>(data);
51
+ }
52
+
53
+ object ITransport.NormalizeDeserializedObject(object data)
54
+ {
55
+ return NormalizeValue(data);
56
+ }
57
+
58
+ // Summary:
59
+ // implements normalization in terms of the inner types used by this
60
+ // JSON library. only handles known JSON types and returns any other
61
+ // types unchanged.
62
+ //
63
+ // Parameters:
64
+ // data:
65
+ // data to normalize.
66
+ //
67
+ // Returns:
68
+ // normalized data
69
+ private static object NormalizeValue(object data)
70
+ {
71
+ if (data is JValue)
72
+ {
73
+ JValue customValue = (JValue)data;
74
+
75
+ return customValue.Value;
76
+ }
77
+ if (data is JObject)
78
+ {
79
+ JObject jobject = (JObject)data;
80
+ Hashtable normalHash = new Hashtable();
81
+
82
+ foreach (JProperty jproperty in jobject.Properties())
83
+ {
84
+ string key = jproperty.Name;
85
+ object value = jproperty.Value;
86
+
87
+ normalHash[key] = NormalizeValue(value);
88
+ }
89
+
90
+ return normalHash;
91
+ }
92
+ if (data is JArray)
93
+ {
94
+ ICollection customCollection = (ICollection)data;
95
+ ArrayList normalCollection = new ArrayList(customCollection.Count);
96
+
97
+ foreach (object customObject in customCollection)
98
+ {
99
+ normalCollection.Add(NormalizeValue(customObject));
100
+ }
101
+
102
+ return normalCollection;
103
+ }
104
+
105
+ return data;
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,158 @@
1
+ /////////////////////////////////////////////////////////////////////////
2
+ // Copyright (c) 2010-2011 RightScale Inc
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining
5
+ // a copy of this software and associated documentation files (the
6
+ // "Software"), to deal in the Software without restriction, including
7
+ // without limitation the rights to use, copy, modify, merge, publish,
8
+ // distribute, sublicense, and/or sell copies of the Software, and to
9
+ // permit persons to whom the Software is furnished to do so, subject to
10
+ // the following conditions:
11
+ //
12
+ // The above copyright notice and this permission notice shall be
13
+ // included in all copies or substantial portions of the Software.
14
+ //
15
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ /////////////////////////////////////////////////////////////////////////
23
+ using System;
24
+ using System.IO;
25
+ using System.IO.Pipes;
26
+
27
+ namespace RightScale
28
+ {
29
+ namespace Common
30
+ {
31
+ namespace Protocol
32
+ {
33
+ // represents a generic text-based pipe client which communicates via a user-supplied transport.
34
+ // the transport must convert requests/responses to discrete text messages delimited by newline.
35
+ public class PipeClient
36
+ {
37
+ // Summary:
38
+ // constructor for a named pipe client.
39
+ //
40
+ // Parameters:
41
+ // pipeName:
42
+ // name of pipe to use when connecting to server.
43
+ public PipeClient(string pipeName, ITransport transport)
44
+ {
45
+ this.pipeName = pipeName;
46
+ this.transport = transport;
47
+ }
48
+
49
+ // Summary:
50
+ // creates a bidirectional pipe client.
51
+ //
52
+ // Parameters:
53
+ // timeoutMsecs:
54
+ // timeout on waiting for connection in milliseconds
55
+ //
56
+ // Throws:
57
+ // System.TimeoutException on failure to connect
58
+ public void Connect(int timeoutMsecs)
59
+ {
60
+ // create bidirectional pipe client.
61
+ pipeClient = new NamedPipeClientStream(pipeName);
62
+ pipeClient.Connect(timeoutMsecs);
63
+
64
+ // create writer.
65
+ streamWriter = new StreamWriter(pipeClient);
66
+ streamWriter.AutoFlush = true;
67
+
68
+ // create reader.
69
+ streamReader = new StreamReader(pipeClient);
70
+ }
71
+
72
+ // Summary:
73
+ // sends a request without waiting for a response.
74
+ //
75
+ // Parameters:
76
+ // request:
77
+ // request to send
78
+ public void Send(object request)
79
+ {
80
+ // send.
81
+ string text = transport.ConvertObjectToString(request);
82
+
83
+ streamWriter.WriteLine(text);
84
+ }
85
+
86
+ // Summary:
87
+ // sends/receives a request/response pair.
88
+ //
89
+ // Parameters:
90
+ // T:
91
+ // expected type for response
92
+ //
93
+ // request:
94
+ // request to send
95
+ //
96
+ // Returns:
97
+ // received response object
98
+ public T SendReceive<T>(object request)
99
+ {
100
+ // send.
101
+ Send(request);
102
+
103
+ // receive.
104
+ {
105
+ string text = streamReader.ReadLine();
106
+
107
+ return (null == text) ? default(T) : transport.ConvertStringToObject<T>(text);
108
+ }
109
+ }
110
+
111
+ // Summary:
112
+ // closes the client and releases all resources.
113
+ public void Close()
114
+ {
115
+ if (null != streamReader)
116
+ {
117
+ try
118
+ {
119
+ streamReader.Close();
120
+ }
121
+ catch (Exception)
122
+ {
123
+ }
124
+ streamReader = null;
125
+ }
126
+ if (null != streamWriter)
127
+ {
128
+ try
129
+ {
130
+ streamWriter.Close();
131
+ }
132
+ catch (Exception)
133
+ {
134
+ }
135
+ streamWriter = null;
136
+ }
137
+ if (null != pipeClient)
138
+ {
139
+ try
140
+ {
141
+ pipeClient.Close();
142
+ }
143
+ catch (Exception)
144
+ {
145
+ }
146
+ pipeClient = null;
147
+ }
148
+ }
149
+
150
+ private ITransport transport = null;
151
+ private NamedPipeClientStream pipeClient = null;
152
+ private StreamReader streamReader = null;
153
+ private StreamWriter streamWriter = null;
154
+ private string pipeName = null;
155
+ }
156
+ }
157
+ }
158
+ }