-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
345 lines (260 loc) · 12.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>WebJCL by niumainframe</title>
<link rel="stylesheet" href="stylesheets/styles.css">
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="javascripts/respond.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!--[if lt IE 8]>
<link rel="stylesheet" href="stylesheets/ie.css">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
</head>
<body>
<div id="header">
<nav>
<li class="fork"><a href="https://github.com/niumainframe/webjcl">View On GitHub</a></li>
<li class="downloads"><a href="https://github.com/niumainframe/webjcl/zipball/master">ZIP</a></li>
<li class="downloads"><a href="https://github.com/niumainframe/webjcl/tarball/master">TAR</a></li>
<li class="title">DOWNLOADS</li>
</nav>
</div><!-- end header -->
<div class="wrapper">
<section>
<div id="title">
<h1>WebJCL</h1>
<p>Bringing IBM mainframe to the cloud.</p>
<hr>
<span class="credits left">Project maintained by <a href="https://github.com/niumainframe">niumainframe</a></span>
<span class="credits right">Hosted on GitHub Pages — Theme by <a href="http://twitter.com/#!/michigangraham">mattgraham</a></span>
</div>
<div style="text-align: center;">
<h1> Want to get started? </h1>
<hr/>
Temporary Instance: <a href="http://turmeric.webjcl.com/">http://turmeric.webjcl.com/</a> <strong>Warning: This one does not save your jobs!</strong> <br> <br>
</div>
<!--
<table>
<tr>
<th> Host </th>
<th> Capacity </th>
<th> Rating </th>
</tr>
<tr>
<td> <a href="http://iceland01.webjcl.com/"> iceland01.webjcl.com </a> </td>
<td> Dedicated 256mb Debian </td>
<td>
<div class="rw-ui-container rw-urid-2"></div>
</td>
</tr>
<tr>
<td> <a href="http://aws01.webjcl.com"> aws01.webjcl.com </a> </td>
<td> Dedicated 512mb Ubuntu </td>
<td>
<div class="rw-ui-container rw-urid-4"></div>
</td>
</tr>
<tr>
<td> <a href="http://pub.webjcl.usetheboost.com/"> pub.webjcl.usetheboost.com </a> </td>
<td> Shared, backup/development </td>
<td> <div class="rw-ui-container rw-urid-3"></div> </td>
</tr> -->
</table>
Want to run your own instance? Please contact <a href="https://github.com/scvnc">Vince</a> to get your instance on this list.
<hr/>
<h1> What is WebJCL? </h1>
<p><img src="http://niumainframe.github.io/webjcl/images/webjcl-screenshot.png" alt="WebJCL Screenshot"></p>
<p>WebJCL is a web-based development environment for programming with IBM mainframe. It allows students to code and execute IBM assembler completely through the web-browser. This was developed during an independent study between students at Northern Illinois University. The server-side source code is currently written in node.js.</p>
<p>Features</p>
<ul>
<li>
<p>HTML5 interface.</p>
<ul>
<li>Ace code editor</li>
<li>Multiple tabs</li>
<li>Resizable input/output panes.</li>
</ul>
</li>
<li>
<p>RESTful job submission interface.</p>
<ul>
<li>Submit jobs to the real mainframe via HTTP protocol.</li>
<li>Support for other job processing modules.</li>
</ul>
</li>
</ul>
<h2>Prerequisites</h2>
<p>Required environments and their minimum tested versions: </p>
<p>Server:</p>
<ul>
<li>
<a href="http://nodejs.org/">Node.js</a> v0.8.19</li>
<li>
<a href="http://www.mongodb.org/">mongoDB</a> v2.2.3</li>
<li>Python 2.6</li>
</ul><p>Client:</p>
<ul>
<li>A modern web browser
<ul>
<li>Chromium 23</li>
<li>Firefox 18</li>
</ul>
</li>
</ul><h2>Install</h2>
<p>To obtain the source code, either download the archive file of your choice from this GitHub repository or run the following command in the directory you wish to install WebJCL.</p>
<pre><code>git clone https://github.com/niumainframe/webjcl.git
</code></pre>
<p>After obtaining the source code, you must obtain the Node.js library requirements.</p>
<pre><code>cd webjcl
npm install
</code></pre>
<h3>Configuration</h3>
<p>There is some mandatory configuration before WebJCL can execute.</p>
<ul>
<li>
<p>config.js</p>
<ul>
<li>Listening port (default 8000)</li>
<li>Whether to enforce SSL (default: true)</li>
<li>mongoDB credentials.</li>
</ul>
</li>
<li>
<p>srcprocs/JESProc/config.js</p>
<ul>
<li>The hostname of the mainframe WebJCL connects to.</li>
</ul>
</li>
</ul><h3>Invoking</h3>
<p>Given that MongoDB is running, one can invoke WebJCL while in the source code directory:</p>
<pre><code>node main.js
</code></pre>
<p>However in public-facing instances, it is highly recommended to use a persistence script which automatically restarts the application if it crashes. The node.js application '<a href="https://npmjs.org/package/forever">forever</a>' is recommended for this purpose.</p>
<h2>Background</h2>
<p>NIU CS teaches the concepts of assembly language through the <a href="https://en.wikipedia.org/wiki/IBM_Basic_assembly_language">IBM Basic Assembly Language</a> and <a href="https://en.wikipedia.org/wiki/ASSIST_(computing">ASSIST</a>). While this is effective in exposing students how to program software at a low level; it is problematic because the development environment is limited compared to today's standards.</p>
<h3>3270 Terminal</h3>
<p>Prior to WebJCL, students typically obtained a 3270 terminal emulator to connect to a shared IBM Mainframe. From this terminal students coded and executed assignment programs.</p>
<p><img src="http://niumainframe.github.io/webjcl/images/3270-terminal.png" alt="Picture of a 3270 terminal"></p>
<p>Programming in a 3270 terminal has the following problems:</p>
<ul>
<li>The terminal has fixed rows/columns and the smallest scrolling unit is typically one page. This causes long assignments and algorithms to span many terminal pages.</li>
<li>Non-intuitive keyboard commands for editing, especially for undergraduate students unfamiliar with vi/emacs-like editors.</li>
<li>Execution and retrieval of output text requires navigating through several menus from the editor.</li>
</ul><h3>Other development options</h3>
<ul>
<li>
<p>Using <a href="http://www.ibm.com/developerworks/systems/library/es-batch-zos.html">FTP-based</a> solutions</p>
<ul>
<li>mar_ftp.exe <a href="http://www.cs.niu.edu/compresource/marist_readme.txt">readme</a>
</li>
<li><a href="https://github.com/scvnc/JESftp">JESftp.py</a></li>
<li><a href="https://github.com/john-charles/MVSTool">MVS-Tool</a></li>
<li><a href="http://search.cpan.org/%7Emikeo/MVS-JESFTP-1.1/JESFTP.pm">MVS::JESFTP</a></li>
</ul>
</li>
<li>
<p>Using Simulators/Emulators</p>
<ul>
<li><a href="http://code.google.com/p/mainframe-env-simulator/">mainframe-env-simulator</a></li>
<li><a href="http://z390.org/">z390</a></li>
<li><a href="http://www.hercules-390.eu/">Hercules</a></li>
</ul>
</li>
</ul><h2>Future Development Possibilities</h2>
<p>Currently, this system uses a <a href="https://github.com/scvnc/JESftp">Python script</a> to interface with the actual mainframe to send, submit, retrieve, and clear the submission. It would be nice to design and write a pure node.js module that utilizes the entire Mainframe/FTP interface.</p>
<p>Adding additional job processing modules such as one that submits the job to a mainframe simulator or emulator instead of a real mainframe. This could be extended further to other language/machine environments.</p>
<p>Converting the database features to work with MySQL instead of mongoDB.</p>
<p>File management features.</p>
<p>Real-time collaboration/execution on code via something like the <a href="http://sharejs.org/">share.js</a> library.</p>
<p>IBM assembler specific indentation and highlighting features for the editor.</p>
<h2>Q&A</h2>
<p>Where to I go to use this?</p>
<blockquote>
<p>WebJCL does not have a permanent host. It runs great on the free EC2 node from Amazon, if you'd like to set one up. Efforts will be made to have a host available each semester for student use.</p>
</blockquote>
<p>Do I need to set up my mainframe account with a 3270 terminal?</p>
<blockquote>
<p>For students taking CSCI 360: as far as we are concerned you could never touch a 3270 terminal, use WebJCL, and successfully complete the class. It is still suggested to complete the lab tutorial on configuring your account on the mainframe. The same should go for CSCI 640 as well.</p>
</blockquote>
<p>Is my source code saved anywhere?</p>
<blockquote>
<p>Yes. When you submit code, both the code and the resulting output are saved in a database. <em>Your code/output is only accessible with your login credentials.</em></p>
</blockquote>
<p>Does it work for students in CSCI 465 (or other mainframe courses)?</p>
<blockquote>
<p>Since this simply submits a JCL file to be processed, probably yes. However, since there are instances where you must reference files on the remote mainframe: you may have to manually FTP some of your files. Let us know your experiences.</p>
</blockquote>
<p>Does this really work?</p>
<blockquote>
<p>Yes. WebJCL was exposed to students taking CSCI 360 during Spring 2013. Between 16 active users, 6000 jobs were submitted via WebJCL and all assignments can be successfully completed.</p>
</blockquote>
<p>How secure is this?</p>
<ul>
<li>WebJCL can run as an underprivileged user.</li>
<li>WebJCL works with existing web-servers by configuring a <a href="https://httpd.apache.org/docs/2.2/mod/mod_proxy.html">reverse proxy</a>.</li>
<li>WebJCL can enforce SSL connections for secure transmission of mainframe credentials.
<ul>
<li>However, the FTP interface to the mainframe probably has it's credentials sent in cleartext.</li>
</ul>
</li>
<li>WebJCL practices password hashing.</li>
<li>Temporary folders are created with permissions of 700.</li>
</ul><p>Can I add a feature to WebJCL?</p>
<blockquote>
<p>Contact us (see support section) and make a request on the GitHub issue tracker. We want to assist other students to continue this project. Most likely you could even get independent study credit at NIU. Fork away!</p>
</blockquote>
<h2>Support</h2>
<p>For support and collaboration inquiries, please contact Vincent: vinciple [at] gmail [dot] com.</p>
<p>Please utilize the issue tracker on GitHub for bugs, feature requests, and other applicable articles.</p>
<h2>Usage Statistics</h2>
<a href="/heatmap-2013">Click to see usage heatmap for 2013</a>
</section>
</div>
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
<div class="rw-js-container">
<script type="text/javascript">
// Async Rating-Widget initialization.
function RW_Async_Init(){
RW.init({
uid: "75ACAF5CCC522C59EA31293B59812C6C",
huid: "134111",
options: {
advanced: {
text: {
rateThis: "Rate this server"
}
},
style: "oxygen"
}
});
RW.render();
}
// Append Rating-Widget JavaScript library.
if (typeof(RW) == "undefined"){
(function(){
var rw = document.createElement("script"),
d = new Date(), ck = "Y" + d.getFullYear() + "M" + d.getMonth() + "D" + d.getDate();
rw.type = "text/javascript"; rw.async = true;
rw.src = "http://js.rating-widget.com/external.min.js?ck=" + ck;
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(rw, s);
})();
}
</script>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-44613514-1', 'webjcl.com');
ga('send', 'pageview');
</script>
</body>
</html>