net-ssh 1.1.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (297) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/{THANKS → THANKS.rdoc} +2 -5
  6. data/lib/net/ssh.rb +189 -57
  7. data/lib/net/ssh/authentication/agent.rb +175 -0
  8. data/lib/net/ssh/authentication/constants.rb +18 -0
  9. data/lib/net/ssh/authentication/key_manager.rb +166 -0
  10. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  11. data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  12. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  13. data/lib/net/ssh/authentication/methods/password.rb +39 -0
  14. data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  15. data/lib/net/ssh/authentication/pageant.rb +176 -0
  16. data/lib/net/ssh/authentication/session.rb +116 -0
  17. data/lib/net/ssh/buffer.rb +339 -0
  18. data/lib/net/ssh/buffered_io.rb +149 -0
  19. data/lib/net/ssh/config.rb +173 -0
  20. data/lib/net/ssh/connection/channel.rb +575 -454
  21. data/lib/net/ssh/connection/constants.rb +31 -45
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +176 -88
  24. data/lib/net/ssh/errors.rb +83 -61
  25. data/lib/net/ssh/key_factory.rb +85 -0
  26. data/lib/net/ssh/known_hosts.rb +129 -0
  27. data/lib/net/ssh/loggable.rb +61 -0
  28. data/lib/net/ssh/packet.rb +102 -0
  29. data/lib/net/ssh/prompt.rb +93 -0
  30. data/lib/net/ssh/proxy/errors.rb +8 -28
  31. data/lib/net/ssh/proxy/http.rb +75 -107
  32. data/lib/net/ssh/proxy/socks4.rb +35 -48
  33. data/lib/net/ssh/proxy/socks5.rb +76 -108
  34. data/lib/net/ssh/service/forward.rb +267 -0
  35. data/lib/net/ssh/test.rb +89 -0
  36. data/lib/net/ssh/test/channel.rb +129 -0
  37. data/lib/net/ssh/test/extensions.rb +152 -0
  38. data/lib/net/ssh/test/kex.rb +44 -0
  39. data/lib/net/ssh/test/local_packet.rb +51 -0
  40. data/lib/net/ssh/test/packet.rb +81 -0
  41. data/lib/net/ssh/test/remote_packet.rb +38 -0
  42. data/lib/net/ssh/test/script.rb +157 -0
  43. data/lib/net/ssh/test/socket.rb +59 -0
  44. data/lib/net/ssh/transport/algorithms.rb +384 -0
  45. data/lib/net/ssh/transport/cipher_factory.rb +72 -0
  46. data/lib/net/ssh/transport/constants.rb +22 -58
  47. data/lib/net/ssh/transport/hmac.rb +31 -0
  48. data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
  49. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  50. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  51. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  52. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  53. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  54. data/lib/net/ssh/transport/identity_cipher.rb +40 -0
  55. data/lib/net/ssh/transport/kex.rb +13 -0
  56. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  57. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  58. data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
  59. data/lib/net/ssh/transport/packet_stream.rb +230 -0
  60. data/lib/net/ssh/transport/server_version.rb +61 -0
  61. data/lib/net/ssh/transport/session.rb +225 -303
  62. data/lib/net/ssh/transport/state.rb +170 -0
  63. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  64. data/lib/net/ssh/verifiers/null.rb +12 -0
  65. data/lib/net/ssh/verifiers/strict.rb +53 -0
  66. data/lib/net/ssh/version.rb +57 -26
  67. data/net-ssh.gemspec +54 -0
  68. data/setup.rb +1585 -0
  69. data/test/authentication/methods/common.rb +28 -0
  70. data/test/authentication/methods/test_abstract.rb +51 -0
  71. data/test/authentication/methods/test_hostbased.rb +108 -0
  72. data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  73. data/test/authentication/methods/test_password.rb +50 -0
  74. data/test/authentication/methods/test_publickey.rb +123 -0
  75. data/test/authentication/test_agent.rb +205 -0
  76. data/test/authentication/test_key_manager.rb +100 -0
  77. data/test/authentication/test_session.rb +93 -0
  78. data/test/common.rb +106 -0
  79. data/test/configs/exact_match +8 -0
  80. data/test/configs/wild_cards +14 -0
  81. data/test/connection/test_channel.rb +452 -0
  82. data/test/connection/test_session.rb +483 -0
  83. data/test/test_all.rb +6 -0
  84. data/test/test_buffer.rb +336 -0
  85. data/test/test_buffered_io.rb +63 -0
  86. data/test/test_config.rb +78 -0
  87. data/test/test_key_factory.rb +67 -0
  88. data/test/transport/hmac/test_md5.rb +34 -0
  89. data/test/transport/hmac/test_md5_96.rb +25 -0
  90. data/test/transport/hmac/test_none.rb +34 -0
  91. data/test/transport/hmac/test_sha1.rb +34 -0
  92. data/test/transport/hmac/test_sha1_96.rb +25 -0
  93. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  94. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  95. data/test/transport/test_algorithms.rb +302 -0
  96. data/test/transport/test_cipher_factory.rb +163 -0
  97. data/test/transport/test_hmac.rb +34 -0
  98. data/test/transport/test_identity_cipher.rb +40 -0
  99. data/test/transport/test_packet_stream.rb +433 -0
  100. data/test/transport/test_server_version.rb +55 -0
  101. data/test/transport/test_session.rb +312 -0
  102. data/test/transport/test_state.rb +173 -0
  103. metadata +102 -253
  104. data/ChangeLog +0 -560
  105. data/LICENSE +0 -7
  106. data/NEWS +0 -152
  107. data/README +0 -14
  108. data/bin/rb-keygen +0 -210
  109. data/doc/LICENSE-BSD +0 -27
  110. data/doc/LICENSE-GPL +0 -280
  111. data/doc/LICENSE-RUBY +0 -56
  112. data/doc/manual-html/chapter-1.html +0 -388
  113. data/doc/manual-html/chapter-2.html +0 -552
  114. data/doc/manual-html/chapter-3.html +0 -470
  115. data/doc/manual-html/chapter-4.html +0 -413
  116. data/doc/manual-html/chapter-5.html +0 -525
  117. data/doc/manual-html/chapter-6.html +0 -456
  118. data/doc/manual-html/chapter-7.html +0 -343
  119. data/doc/manual-html/index.html +0 -235
  120. data/doc/manual-html/stylesheets/manual.css +0 -270
  121. data/doc/manual-html/stylesheets/ruby.css +0 -17
  122. data/doc/manual/chapter.erb +0 -38
  123. data/doc/manual/example.erb +0 -18
  124. data/doc/manual/index.erb +0 -29
  125. data/doc/manual/manual.rb +0 -311
  126. data/doc/manual/manual.yml +0 -73
  127. data/doc/manual/page.erb +0 -87
  128. data/doc/manual/parts/0000.txt +0 -5
  129. data/doc/manual/parts/0001.txt +0 -3
  130. data/doc/manual/parts/0002.txt +0 -40
  131. data/doc/manual/parts/0003.txt +0 -6
  132. data/doc/manual/parts/0004.txt +0 -7
  133. data/doc/manual/parts/0005.txt +0 -1
  134. data/doc/manual/parts/0006.txt +0 -49
  135. data/doc/manual/parts/0007.txt +0 -67
  136. data/doc/manual/parts/0008.txt +0 -43
  137. data/doc/manual/parts/0009.txt +0 -14
  138. data/doc/manual/parts/0010.txt +0 -7
  139. data/doc/manual/parts/0011.txt +0 -14
  140. data/doc/manual/parts/0012.txt +0 -3
  141. data/doc/manual/parts/0013.txt +0 -20
  142. data/doc/manual/parts/0014.txt +0 -32
  143. data/doc/manual/parts/0015.txt +0 -14
  144. data/doc/manual/parts/0016.txt +0 -28
  145. data/doc/manual/parts/0017.txt +0 -50
  146. data/doc/manual/parts/0018.txt +0 -35
  147. data/doc/manual/parts/0019.txt +0 -7
  148. data/doc/manual/parts/0020.txt +0 -72
  149. data/doc/manual/parts/0021.txt +0 -50
  150. data/doc/manual/parts/0022.txt +0 -42
  151. data/doc/manual/parts/0023.txt +0 -51
  152. data/doc/manual/parts/0024.txt +0 -18
  153. data/doc/manual/parts/0025.txt +0 -18
  154. data/doc/manual/parts/0026.txt +0 -15
  155. data/doc/manual/parts/0027.txt +0 -37
  156. data/doc/manual/parts/0028.txt +0 -16
  157. data/doc/manual/parts/0029.txt +0 -1
  158. data/doc/manual/parts/0030.txt +0 -52
  159. data/doc/manual/parts/0031.txt +0 -25
  160. data/doc/manual/stylesheets/manual.css +0 -270
  161. data/doc/manual/stylesheets/ruby.css +0 -17
  162. data/doc/manual/tutorial.erb +0 -30
  163. data/examples/auth-forward.rb +0 -41
  164. data/examples/channel-demo.rb +0 -81
  165. data/examples/port-forward.rb +0 -51
  166. data/examples/process-demo.rb +0 -91
  167. data/examples/remote-net-port-forward.rb +0 -45
  168. data/examples/remote-port-forward.rb +0 -80
  169. data/examples/shell-demo.rb +0 -46
  170. data/examples/ssh-client.rb +0 -67
  171. data/examples/sync-shell-demo.rb +0 -69
  172. data/examples/tail-demo.rb +0 -49
  173. data/lib/net/ssh/connection/driver.rb +0 -446
  174. data/lib/net/ssh/connection/services.rb +0 -72
  175. data/lib/net/ssh/host-key-verifier.rb +0 -52
  176. data/lib/net/ssh/known-hosts.rb +0 -96
  177. data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
  178. data/lib/net/ssh/null-host-key-verifier.rb +0 -14
  179. data/lib/net/ssh/service/agentforward/driver.rb +0 -78
  180. data/lib/net/ssh/service/agentforward/services.rb +0 -41
  181. data/lib/net/ssh/service/forward/driver.rb +0 -319
  182. data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
  183. data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
  184. data/lib/net/ssh/service/forward/services.rb +0 -76
  185. data/lib/net/ssh/service/process/driver.rb +0 -153
  186. data/lib/net/ssh/service/process/open.rb +0 -193
  187. data/lib/net/ssh/service/process/popen3.rb +0 -178
  188. data/lib/net/ssh/service/process/services.rb +0 -66
  189. data/lib/net/ssh/service/services.rb +0 -60
  190. data/lib/net/ssh/service/shell/driver.rb +0 -86
  191. data/lib/net/ssh/service/shell/services.rb +0 -54
  192. data/lib/net/ssh/service/shell/shell.rb +0 -222
  193. data/lib/net/ssh/service/shell/sync.rb +0 -114
  194. data/lib/net/ssh/session.rb +0 -305
  195. data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
  196. data/lib/net/ssh/transport/compress/compressor.rb +0 -53
  197. data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
  198. data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
  199. data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
  200. data/lib/net/ssh/transport/compress/services.rb +0 -68
  201. data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
  202. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
  203. data/lib/net/ssh/transport/errors.rb +0 -47
  204. data/lib/net/ssh/transport/identity-cipher.rb +0 -61
  205. data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
  206. data/lib/net/ssh/transport/kex/dh.rb +0 -249
  207. data/lib/net/ssh/transport/kex/services.rb +0 -62
  208. data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
  209. data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
  210. data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
  211. data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
  212. data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
  213. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
  214. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
  215. data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
  216. data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
  217. data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
  218. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
  219. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
  220. data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
  221. data/lib/net/ssh/transport/ossl/services.rb +0 -149
  222. data/lib/net/ssh/transport/packet-stream.rb +0 -236
  223. data/lib/net/ssh/transport/services.rb +0 -146
  224. data/lib/net/ssh/transport/version-negotiator.rb +0 -73
  225. data/lib/net/ssh/userauth/agent.rb +0 -222
  226. data/lib/net/ssh/userauth/constants.rb +0 -35
  227. data/lib/net/ssh/userauth/driver.rb +0 -183
  228. data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
  229. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
  230. data/lib/net/ssh/userauth/methods/password.rb +0 -70
  231. data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
  232. data/lib/net/ssh/userauth/methods/services.rb +0 -90
  233. data/lib/net/ssh/userauth/pageant.rb +0 -197
  234. data/lib/net/ssh/userauth/services.rb +0 -141
  235. data/lib/net/ssh/userauth/userkeys.rb +0 -258
  236. data/lib/net/ssh/util/buffer.rb +0 -274
  237. data/lib/net/ssh/util/prompter.rb +0 -73
  238. data/test/ALL-TESTS.rb +0 -18
  239. data/test/connection/tc_channel.rb +0 -136
  240. data/test/connection/tc_driver.rb +0 -287
  241. data/test/connection/tc_integration.rb +0 -87
  242. data/test/proxy/tc_http.rb +0 -209
  243. data/test/proxy/tc_socks4.rb +0 -148
  244. data/test/proxy/tc_socks5.rb +0 -214
  245. data/test/service/agentforward/tc_driver.rb +0 -138
  246. data/test/service/forward/tc_driver.rb +0 -289
  247. data/test/service/forward/tc_local_network_handler.rb +0 -123
  248. data/test/service/forward/tc_remote_network_handler.rb +0 -111
  249. data/test/service/process/tc_driver.rb +0 -79
  250. data/test/service/process/tc_integration.rb +0 -119
  251. data/test/service/process/tc_open.rb +0 -179
  252. data/test/service/process/tc_popen3.rb +0 -164
  253. data/test/tc_integration.rb +0 -80
  254. data/test/transport/compress/tc_none_compress.rb +0 -41
  255. data/test/transport/compress/tc_none_decompress.rb +0 -45
  256. data/test/transport/compress/tc_zlib_compress.rb +0 -61
  257. data/test/transport/compress/tc_zlib_decompress.rb +0 -48
  258. data/test/transport/kex/tc_dh.rb +0 -312
  259. data/test/transport/kex/tc_dh_gex.rb +0 -71
  260. data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
  261. data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
  262. data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
  263. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
  264. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
  265. data/test/transport/ossl/fixtures/not-a-private-key +0 -4
  266. data/test/transport/ossl/fixtures/not-supported +0 -2
  267. data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
  268. data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
  269. data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
  270. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
  271. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
  272. data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
  273. data/test/transport/ossl/hmac/tc_md5.rb +0 -50
  274. data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
  275. data/test/transport/ossl/hmac/tc_none.rb +0 -50
  276. data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
  277. data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
  278. data/test/transport/ossl/tc_buffer.rb +0 -97
  279. data/test/transport/ossl/tc_buffer_factory.rb +0 -67
  280. data/test/transport/ossl/tc_cipher_factory.rb +0 -84
  281. data/test/transport/ossl/tc_digest_factory.rb +0 -39
  282. data/test/transport/ossl/tc_hmac_factory.rb +0 -72
  283. data/test/transport/ossl/tc_key_factory.rb +0 -199
  284. data/test/transport/tc_algorithm_negotiator.rb +0 -170
  285. data/test/transport/tc_identity_cipher.rb +0 -52
  286. data/test/transport/tc_integration.rb +0 -115
  287. data/test/transport/tc_packet_stream.rb +0 -184
  288. data/test/transport/tc_session.rb +0 -296
  289. data/test/transport/tc_version_negotiator.rb +0 -86
  290. data/test/userauth/methods/tc_hostbased.rb +0 -136
  291. data/test/userauth/methods/tc_password.rb +0 -89
  292. data/test/userauth/methods/tc_publickey.rb +0 -167
  293. data/test/userauth/tc_agent.rb +0 -223
  294. data/test/userauth/tc_driver.rb +0 -190
  295. data/test/userauth/tc_integration.rb +0 -97
  296. data/test/userauth/tc_userkeys.rb +0 -265
  297. data/test/util/tc_buffer.rb +0 -217
@@ -1,270 +0,0 @@
1
- body {
2
- background: #FFF;
3
- font-family: sans-serif;
4
- color: #000;
5
- margin: 0px;
6
- }
7
-
8
- a {
9
- color: #00F;
10
- text-decoration: none;
11
- }
12
-
13
- a:hover {
14
- text-decoration: underline;
15
- }
16
-
17
- .product-manual {
18
- text-align: center;
19
- font-size: x-large;
20
- font-variant: small-caps;
21
- font-weight: bold;
22
- color: #005;
23
- }
24
-
25
- .copyright {
26
- text-align: center;
27
- font-size: small;
28
- font-style: italic;
29
- color: #005;
30
- margin-top: 1in;
31
- }
32
-
33
- #banner {
34
- background: #005;
35
- color: #FFF;
36
- border-bottom: 1px solid #000;
37
- padding-top: 0.5em;
38
- padding-bottom: 0.5em;
39
- padding-left: 1em;
40
- margin-bottom: 1em;
41
- }
42
-
43
- #banner .title {
44
- font-size: x-large;
45
- }
46
-
47
- #banner .title:first-letter {
48
- font-size: 250%;
49
- font-weight: normal;
50
- float: left;
51
- margin-top: -7px;
52
- margin-bottom: -7px;
53
- }
54
-
55
- #banner .product {
56
- font-weight: bold;
57
- color: #FF7;
58
- letter-spacing: 0.5em;
59
- }
60
-
61
- #banner .tagline {
62
- font-style: italic;
63
- font-size: large;
64
- letter-spacing: 0.1em;
65
- color: #FFF;
66
- }
67
-
68
- #banner .info {
69
- color: white;
70
- font-size: small;
71
- padding-right: 1em;
72
- }
73
-
74
- #content {
75
- margin-left: 0cm;
76
- margin-right: 1cm;
77
- }
78
-
79
- #navigation {
80
- font-size: x-small;
81
- border-right: 2px groove black;
82
- border-top: 2px groove black;
83
- margin-right: 1em;
84
- width: 200px;
85
- height: 100%;
86
- background: #FFD;
87
- }
88
-
89
- #navigation ul, #navigation ol {
90
- margin-left: 1.2em;
91
- padding-left: 1.2em;
92
- }
93
-
94
- #navigation .license {
95
- font-size: x-small;
96
- text-align: center;
97
- border-top: 1px dashed #005;
98
- margin-top: 2em;
99
- padding: 1em;
100
- }
101
-
102
- .section {
103
- margin-bottom: 1em;
104
- }
105
-
106
- .section p {
107
- text-align: justify;
108
- }
109
-
110
- #content h1 {
111
- background: #005;
112
- color: #FFF;
113
- font-size: x-large;
114
- font-weight: bold;
115
- font-variant: small-caps;
116
- padding: 0.5em;
117
- border: 1px solid #000;
118
- margin-top: 0px;
119
- margin-bottom: 1em;
120
- }
121
-
122
- #content h2 {
123
- background: #005;
124
- color: #FFF;
125
- font-size: large;
126
- font-weight: bold;
127
- font-variant: small-caps;
128
- padding: 0.25em;
129
- padding-left: 0.5em;
130
- border: 1px solid #000;
131
- margin-bottom: 1em;
132
- }
133
-
134
- #content h3 {
135
- background: #FFD;
136
- color: #000;
137
- font-size: normal;
138
- font-weight: bold;
139
- font-variant: small-caps;
140
- padding: 0.25em;
141
- padding-left: 0.5em;
142
- border: 1px dotted #000;
143
- margin-bottom: 1em;
144
- }
145
-
146
- #content h4 {
147
- background: #FFE;
148
- color: #000;
149
- font-size: normal;
150
- font-weight: bold;
151
- font-variant: small-caps;
152
- padding: 0.25em;
153
- padding-left: 0.5em;
154
- border: 1px dotted #777;
155
- margin-bottom: 1em;
156
- }
157
-
158
- #navigation h1 {
159
- margin: 0px;
160
- padding: 1em;
161
- color: #005;
162
- background: transparent;
163
- font-weight: bold;
164
- font-size: 150%;
165
- font-variant: small-caps;
166
- text-align: center;
167
- }
168
-
169
- #navigation h2 {
170
- margin: 0px;
171
- margin-bottom: 1em;
172
- padding: 0.5em;
173
- border-top: 1px dashed #005;
174
- border-bottom: 1px dashed #005;
175
- color: #005;
176
- background: transparent;
177
- font-weight: bold;
178
- font-size: 125%;
179
- font-variant: small-caps;
180
- text-align: center;
181
- }
182
-
183
- table.list {
184
- margin: 2em;
185
- border: 1px solid black;
186
- background: #FFD;
187
- padding: 0px;
188
- border-spacing: 0px;
189
- }
190
-
191
- table.list th {
192
- border-bottom: 1px solid #005;
193
- padding-bottom: 5px;
194
- background: #008;
195
- color: white;
196
- padding: 0.5em;
197
- text-align: left;
198
- }
199
-
200
- table.list td {
201
- padding: 0.2em;
202
- text-align: left;
203
- vertical-align: top;
204
- border-bottom: 1px solid;
205
- }
206
-
207
- .prevnext {
208
- padding: 0.5em 1em 0.5em 1em;
209
- background: #557;
210
- color: #FFF;
211
- font-size: small;
212
- font-weight: bold;
213
- border: 1px solid #000;
214
- }
215
-
216
- .prevnext a {
217
- color: #FF0;
218
- }
219
-
220
- .top .prevnext {
221
- margin: 0 0 1em 0;
222
- text-align: left;
223
- }
224
-
225
- .bottom .prevnext {
226
- margin: 1em 0 0 0;
227
- text-align: right;
228
- }
229
-
230
- .figure {
231
- border: 1px solid black;
232
- line-height: normal;
233
- background: #FFD;
234
- margin: 2em;
235
- }
236
-
237
- .figure .caption {
238
- background: #008;
239
- color: white;
240
- font-weight: bold;
241
- font-size: small;
242
- padding: 4px 24px 4px 8px;
243
- margin-left: -4px;
244
- border: 1px dotted #77F;
245
- }
246
-
247
- .figure table {
248
- padding-top: 0.8em;
249
- padding-bottom: 0.5em;
250
- }
251
-
252
- .figure .body {
253
- padding-left: 1em;
254
- }
255
-
256
- .figure pre {
257
- padding: 0px;
258
- background: transparent;
259
- border: none;
260
- font-size: small;
261
- font-family: monospace;
262
- }
263
-
264
- .figure .lineno {
265
- text-align: right;
266
- color: #B00;
267
- font-family: monospace;
268
- font-size: small;
269
- padding-right: 1em;
270
- }
@@ -1,17 +0,0 @@
1
- .ruby .normal {}
2
- .ruby .comment { color: #005; font-style: italic; }
3
- .ruby .keyword { color: #A00; font-weight: bold; }
4
- .ruby .method { color: #077; }
5
- .ruby .class { color: #074; }
6
- .ruby .module { color: #050; }
7
- .ruby .punct { color: #447; font-weight: bold; }
8
- .ruby .symbol { color: #099; }
9
- .ruby .string { color: #944; }
10
- .ruby .char { color: #F07; }
11
- .ruby .ident { color: #004; }
12
- .ruby .constant { color: #07F; }
13
- .ruby .regex { color: #B66; }
14
- .ruby .number { color: #D55; }
15
- .ruby .attribute { color: #377; }
16
- .ruby .global { color: #3B7; }
17
- .ruby .expr { color: #227; }
@@ -1,38 +0,0 @@
1
- <div class="top"><div class="prevnext">
2
- <% if previous_chapter %>
3
- <a href="chapter-<%= previous_chapter.index %>.html">Previous (<%= previous_chapter.index %>. <%= previous_chapter.title %>)</a> |
4
- <% end %>
5
- <a href="index.html">Up</a>
6
- <% if next_chapter %>
7
- | <a href="chapter-<%= next_chapter.index %>.html">Next (<%= next_chapter.index %>. <%= next_chapter.title %>)</a>
8
- <% end %>
9
- </div></div>
10
-
11
- <h1><%= object.index %>. <%= object.title %></h1>
12
-
13
- <% object.sections.each do |section|
14
-
15
- if section.title %>
16
-
17
- <h2>
18
- <a name="s<%= section.index %>"></a>
19
- <%= object.index %>.<%= section.index %>. <%= section.title %>
20
- </h2>
21
-
22
- <% end %>
23
-
24
- <div class="section">
25
- <%= section.content.to_html %>
26
- </div>
27
-
28
- <% end %>
29
-
30
- <div class="bottom"><div class="prevnext">
31
- <% if previous_chapter %>
32
- <a href="chapter-<%= previous_chapter.index %>.html">Previous (<%= previous_chapter.index %>. <%= previous_chapter.title %>)</a> |
33
- <% end %>
34
- <a href="index.html">Up</a>
35
- <% if next_chapter %>
36
- | <a href="chapter-<%= next_chapter.index %>.html">Next (<%= next_chapter.index %>. <%= next_chapter.title %>)</a>
37
- <% end %>
38
- </div></div>
@@ -1,18 +0,0 @@
1
- <h1>Example #<%= object.index %>. <%= object.title %></h1>
2
-
3
- <h2>Introduction</h2>
4
-
5
- <%= object.intro.to_html %>
6
-
7
- <h2>Design</h2>
8
-
9
- <%= object.design.to_html %>
10
-
11
- <h2>Implementation</h2>
12
-
13
- <%= object.implementation.to_html %>
14
-
15
- <h2>Summary</h2>
16
-
17
- <%= object.summary.to_html %>
18
-
@@ -1,29 +0,0 @@
1
- <p class="product-manual">Product Manual</p>
2
-
3
- <p align="center">
4
- <img src="<%= manual.product.logo %>"
5
- alt="<%= manual.product.name %>: <%= manual.product.tagline %>" />
6
- </p>
7
-
8
- <p align="center">
9
- <% manual.product.urls.each do |item| %>
10
- <%= item.keys.first %>: <a href="<%= item.values.first %>"><%= item.values.first %></a><br />
11
- <% end %>
12
- </p>
13
-
14
- <% if manual.recent_updates && manual.recent_updates.length > 0 %>
15
- <p align="center"><strong>Recent Updates to This Manual</strong></p>
16
- <table border='0' cellpadding='0' cellspacing='0' align='center'><tr><td>
17
- <ul>
18
- <% manual.recent_updates.each do |update| %>
19
- <li><%= update %></li>
20
- <% end %>
21
- </ul>
22
- </table>
23
- <% end %>
24
-
25
- <p class="copyright">
26
- Copyright &copy; <%= manual.meta.copyright %>
27
- <%= manual.meta.author %>
28
- (<a href="mailto:<%= manual.meta.email %>"><%= manual.meta.email %></a>)
29
- </p>
@@ -1,311 +0,0 @@
1
- # --------------------------------------------------------------------------
2
- # Portions of this code were taken from the "poignant.rb" script created
3
- # by whytheluckystiff, which generates "Why's (Poignant) Guide to Ruby".
4
- # The original script may be obtained from the poignant CVS repository,
5
- # at http://poignant.rubyforge.org.
6
- #
7
- # This script is distributed under the by-sa/1.0 Creative Commons license.
8
- # --------------------------------------------------------------------------
9
-
10
- require 'erb'
11
- require 'fileutils'
12
- require 'yaml'
13
- require 'redcloth'
14
- require 'syntax/convertors/html'
15
-
16
- module Net ; module SSH
17
- module Manual
18
-
19
- class Manual
20
- attr_accessor :product, :meta, :chapters, :tutorials, :examples, :recent_updates
21
-
22
- def Manual.load( file_name )
23
- File.open( file_name ) { |file| YAML.load( file ) }
24
- end
25
- end
26
-
27
- class Meta
28
- attr_accessor :copyright, :author, :email
29
- end
30
-
31
- class Product
32
- attr_accessor :name, :tagline, :version, :logo, :urls, :project
33
- end
34
-
35
- class Sidebar
36
- attr_accessor :title, :content
37
- end
38
-
39
- class Chapter
40
- attr_accessor :index, :title, :sections
41
-
42
- def initialize( index, title, sections )
43
- @index = index
44
- @title = title
45
-
46
- section_index = 0
47
- @sections = ( sections || [] ).collect do |section|
48
- section_index += 1
49
- if section.respond_to? :keys
50
- Section.new( section_index, section.keys.first, section.values.first )
51
- else
52
- section_index -= 1
53
- Section.new( section_index, nil, section )
54
- end
55
- end
56
- end
57
-
58
- def page_title
59
- "Chapter #{index}: #{title}"
60
- end
61
- end
62
-
63
- class Tutorial
64
- attr_accessor :index, :title, :brief, :intro, :steps, :summary
65
-
66
- def initialize( index, title, brief, intro, steps, summary )
67
- @index = index
68
- @title = title
69
- @brief = RedCloth.new( brief )
70
- @intro = RedCloth.new( intro ) if intro
71
- @summary = RedCloth.new( summary ) if summary
72
- @steps = steps.map { |step| RedCloth.new( step ) }
73
- end
74
-
75
- def page_title
76
- "Tutorial #{index}: #{title}"
77
- end
78
- end
79
-
80
- class Example
81
- attr_accessor :index, :title, :brief, :intro, :design, :implementation, :summary
82
-
83
- def initialize( index, title, brief, intro, design, implementation, summary )
84
- @index = index
85
- @title = title
86
- @brief = RedCloth.new( brief )
87
- @intro = RedCloth.new( intro )
88
- @design = RedCloth.new( design )
89
- @implementation = RedCloth.new( implementation )
90
- @summary = RedCloth.new( summary )
91
- end
92
-
93
- def page_title
94
- "Example #{index}: #{title}"
95
- end
96
- end
97
-
98
- class Section
99
- attr_accessor :index, :title, :content
100
-
101
- def initialize( index, title, content )
102
- @index = index
103
- @title = RedCloth.new( title ).to_html.gsub( %r{</?p>}, "" ) if title
104
- @content = FigureContainer.new( content || "" )
105
- end
106
- end
107
-
108
- class FigureContainer
109
- def initialize( content )
110
- @content = content
111
- @html = nil
112
- end
113
-
114
- def to_html
115
- return @html if @html
116
- extract_figures
117
- convert_to_html
118
- replace_figures
119
- @html
120
- end
121
-
122
- private
123
-
124
- Figure = Struct.new( :opts, :body )
125
-
126
- def extract_figures
127
- @figures = []
128
- @content.gsub!( /^\{\{\{(.*?)?\n(.*?)\n\}\}\}$/m ) do
129
- body = $2.strip
130
- opts = Hash[*$1.strip.split(/,/).map{|p| p.split(/=/)}.flatten]
131
- @figures << Figure.new( opts, body )
132
- "====#{@figures.length-1}===="
133
- end
134
- end
135
-
136
- def convert_to_html
137
- @html = ( @content.length < 1 ? "" :
138
- RedCloth.new( @content ).to_html )
139
- end
140
-
141
- def replace_figures
142
- @html.gsub!( /<p>====(.*?)====<\/p>/ ) do
143
- figure = @figures[$1.to_i]
144
- lang = figure.opts["lang"]
145
- caption = figure.opts["caption"] || "Figure"
146
- caption << " [#{lang}]" if lang
147
-
148
- body = figure.body
149
-
150
- if lang
151
- convertor = Syntax::Convertors::HTML.for_syntax( lang )
152
-
153
- body = "<link rel='stylesheet' type='text/css' " +
154
- "href='stylesheets/#{lang}.css' />" +
155
- "<div class='#{lang}'>" +
156
- convertor.convert( body ) +
157
- "</div>"
158
- end
159
-
160
- if figure.opts["number"] && eval(figure.opts["number"])
161
- line = 1
162
- numbers = ""
163
- body.each_line { numbers << "#{line}<br />"; line += 1 }
164
- body = "<table border='0' cellpadding='0' cellspacing='0'>" +
165
- "<tr><td class='lineno'>#{numbers}</td>" +
166
- "<td width='100%'>#{body}</td></tr></table>"
167
- end
168
-
169
- "<div class='figure'>\n" +
170
- "<span class='caption'>#{caption}</span>\n" +
171
- "<div class='body'>#{body}</div>" +
172
- "</div>"
173
- end
174
- end
175
- end
176
-
177
- YAML.add_private_type( 'file' ) { |type_id, value| File.read( value ) rescue "" }
178
- YAML.add_private_type( 'eval' ) { |type_id, value| eval( value ) }
179
-
180
- YAML.add_domain_type( 'jamisbuck.org,2004', 'manual' ) do |taguri, val|
181
- index = 0
182
-
183
- val['chapters'].collect! do |chapter|
184
- index += 1
185
- Chapter.new( index, chapter.keys.first, chapter.values.first )
186
- end
187
-
188
- index = 0
189
- ( val['tutorials'] ||= [] ).collect! do |tutorial|
190
- index += 1
191
- content = tutorial.values.first
192
- Tutorial.new( index, tutorial.keys.first, content['brief'], content['intro'],
193
- content['steps'], content['summary'] )
194
- end
195
-
196
- index = 0
197
- ( val['examples'] ||= [] ).collect! do |example|
198
- index += 1
199
- content = example.values.first
200
- Example.new( index, example.keys.first, content['brief'], content['intro'], content['design'],
201
- content['implementation'], content['summary'] )
202
- end
203
-
204
- YAML.object_maker( Manual, val )
205
- end
206
-
207
- YAML.add_domain_type( 'jamisbuck.org,2004', 'meta' ) do |taguri, val|
208
- YAML.object_maker( Meta, val )
209
- end
210
-
211
- YAML.add_domain_type( 'jamisbuck.org,2004', 'product' ) do |taguri, val|
212
- version = val["version"]
213
- if version.respond_to?( :type_id )
214
- if version.type_id == "version"
215
- if version.value =~ %r{(.*)/(.*)}
216
- require_file, constant = $1, $2
217
- else
218
- constant = version.value
219
- end
220
-
221
- require require_file if require_file
222
- val["version"] = eval(constant)
223
- else
224
- raise "Unexpected type: #{val.type_id}"
225
- end
226
- end
227
- YAML.object_maker( Product, val )
228
- end
229
-
230
- YAML.add_domain_type( 'jamisbuck.org,2004', 'sidebar' ) do |taguri, val|
231
- YAML.object_maker( Sidebar,
232
- 'title' => val.keys.first,
233
- 'content'=> RedCloth.new( val.values.first ) )
234
- end
235
-
236
- end
237
- end; end
238
-
239
- if __FILE__ == $0
240
-
241
- def log_action( action )
242
- $stderr.puts action
243
- end
244
-
245
- unless ( output_path = ARGV[0] )
246
- $stderr.puts "Usage: #{$0} [/path/to/save/html]"
247
- exit
248
- end
249
-
250
- FileUtils.mkdir_p File.join( output_path, "stylesheets" )
251
-
252
- log_action "Loading manual.yml..."
253
- manual = Net::SSH::Manual::Manual.load( 'manual.yml' )
254
-
255
- # force these to be defined at the TOPLEVEL_BINDING
256
- object = nil
257
- guts = nil
258
-
259
- page = File.open( "page.erb" ) { |file| ERB.new( file.read ) }
260
- page.filename = "page.erb"
261
-
262
- template = File.open( "index.erb" ) { |file| ERB.new( file.read ) }
263
- template.filename = "index.erb"
264
-
265
- File.open( File.join( output_path, "index.html" ), "w" ) do |file|
266
- guts = template.result
267
- file << page.result
268
- end
269
-
270
- template = File.open( "chapter.erb" ) { |file| ERB.new( file.read ) }
271
- template.filename = "chapter.erb"
272
-
273
- manual.chapters.each_with_index do |object,index|
274
- log_action "Processing chapter ##{object.index}..."
275
-
276
- previous_chapter = ( index < 1 ? nil : manual.chapters[index-1] )
277
- next_chapter = manual.chapters[index+1]
278
-
279
- File.open( File.join( output_path, "chapter-#{object.index}.html" ), "w" ) do |file|
280
- guts = template.result( binding )
281
- file << page.result( binding )
282
- end
283
- end
284
-
285
- template = File.open( "tutorial.erb" ) { |file| ERB.new( file.read ) }
286
- template.filename = "tutorial.erb"
287
-
288
- manual.tutorials.each do |object|
289
- log_action "Processing tutorial ##{object.index}..."
290
- File.open( File.join( output_path, "tutorial-#{object.index}.html" ), "w" ) do |file|
291
- guts = template.result
292
- file << page.result
293
- end
294
- end
295
-
296
- # template = File.open( "example.erb" ) { |file| ERB.new( file.read ) }
297
- # template.filename = "example.erb"
298
-
299
- # manual.examples.each do |object|
300
- # log_action "Processing example ##{object.index}..."
301
- # File.open( File.join( output_path, "example-#{object.index}.html" ), "w" ) do |file|
302
- # guts = template.result
303
- # file << page.result
304
- # end
305
- # end
306
-
307
- log_action "Copying style sheets..."
308
- FileUtils.cp Dir["stylesheets/*.css"], File.join( output_path, "stylesheets" )
309
-
310
- log_action "Done!"
311
- end