net-ssh 1.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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