<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/310/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Woolardfa</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/310/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Woolardfa"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/Special:Contributions/Woolardfa"/>
	<updated>2026-06-26T01:41:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=116187</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=116187"/>
		<updated>2014-12-01T15:12:01Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RTMP streaming media filter&#039;&#039;&#039; is used to replace links containing URLs beginning with rtmp:// with a Flowplayer media player using their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin]. It is contributed by [http://moodle.org/user/view.php?id=286444 Lacey Vickery] and [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Page output is examined for anchor href values beginning with rtmp:// and ending with a supported extension (currently .mp3, .mp4, .flv,, .f4v, and .mov). Qualifying links are replaced with a span tag containing &#039;data-&#039; prefixed attributes that are subsequently used by the plugin&#039;s JavaScript module to apply a Flowplayer player to the span. The Adobe Flash Player browser plugin is required.&lt;br /&gt;
&lt;br /&gt;
The plugin was developed to work with Adobe&#039;s Flash Media Server, but according to Flowplayer, their [http://flash.flowplayer.org/plugins/streaming/rtmp.html RTMP plugin] should work with Wowza, and Red5 as well. The plugin has been tested successfully with Amazon&#039;s Cloudfront streaming service.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the filter_rtmp.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the &#039;&#039;&#039;filter/&#039;&#039;&#039; folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
* Enable and configure the plugin (Site administration-&amp;gt;Plugins-&amp;gt;Filters-&amp;gt;Manage filters).&lt;br /&gt;
&lt;br /&gt;
=How to use=&lt;br /&gt;
In places where you can enter HTML (e.g. wysiwyg editor for topic summary, page resource, etc.), create a link and supply a URL that references the media stream you want to play. The URL would look something like: &#039;&#039;rtmp://fms.example.org/vod/classes/lecture01.flv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The file extensions filtered are: &#039;&#039;&#039;.flv, .mp4, .f4v, .mov, and .mp3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Cloudfront Streams==&lt;br /&gt;
Amazon&#039;s Cloudfront streaming requires the Flowplayer config values for netConnectionUrl, and the clip&#039;s URL to be slightly different. For streams originating at Cloudfront append the following query string paramter to the URL so the filter will adjust accordingly: &#039;&#039;&#039;?provider=acf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Playlists (v1.3)=&lt;br /&gt;
Support for playlists has been added. Refer to the [[Playlist plugin]] docs.&lt;br /&gt;
&lt;br /&gt;
=Closed Captions (v1.4)=&lt;br /&gt;
Support for closed captioning has been added. The filter can optionally load Flowplayer&#039;s [http://flash.flowplayer.org/plugins/flash/captions.html Captions] and [http://flash.flowplayer.org/plugins/flash/content.html Content] Flash plugins (.swf) to display closed captioning in the media player window. Even though Flowplayer&#039;s Caption plugin can load an external file containing the caption information, the filter does not yet provide for this method. The caption information must be embedded into the media file, such as an MP4 subtitles track, or FLV cuepoints.&lt;br /&gt;
&lt;br /&gt;
The filter has an additional site config to determine whether or not to load the Caption plugin by default. To override that default append the following query strting parameter to the URL: &#039;&#039;&#039;&#039;?captions=1&#039;&#039;&#039;&#039;, or &#039;&#039;&#039;&#039;captions=0&#039;&#039;&#039;&#039;, to load or not load the Captions plugin, respectively. These query string parameters are detected in playlists, so you can be selective about which clips in a playlist display closed captions.&lt;br /&gt;
&lt;br /&gt;
=HLS from Wowza &amp;amp; FMS (v1.5)=&lt;br /&gt;
Support for HTML5 video and audio has been added. Wowza&#039;s Streaming Engine and Adobe&#039;s Flash Media Server each support (after some configuration) Apple&#039;s HLS to allow delivery to iOS devices. The filter can detect whether the Flash plugin is present in the browser, and if configured to do so, will emit primitive HTML5 &amp;lt;video&amp;gt; and &amp;lt;audio&amp;gt; tags with source URLs corresponding to the Wowza/FMS HLS stream.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=filter_rtmp here].&lt;br /&gt;
&lt;br /&gt;
=Source code=&lt;br /&gt;
The source code repository is located at github.com in the [http://github.com/appalachianstate/moodle-filter_rtmp appalachianstate/moodle-filter_rtmp] repository.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=114145</id>
		<title>SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=114145"/>
		<updated>2014-08-13T14:17:06Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==SHEBanG enrolment plugin/module for Banner(r) LMB data import.==&lt;br /&gt;
&lt;br /&gt;
This enrollment plugin provides a way for Moodle to consume Banner® LMB (Luminis Message Broker) messages. This module is not an Ellucian product, and is neither endorsed nor supported by Ellucian.  It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a configured target URL; that URL should end up resolving to $CFG-&amp;gt;wwwroot/enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias; aliases will not work from Moodle 2.6 and later). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrolment plugin, [https://moodle.org/plugins/view.php?plugin=enrol_lmb, LMB (enrol_lmb)] developed by [https://moodle.org/user/profile.php?id=139623, Eric Merrill] that processes Banner data, and has many more configuration options and features. We used Eric&#039;s plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installation of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
&#039;&#039;&#039;THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
In versions for Moodle 2.x, an option was added allowing selection of what is placed in the [mdl_user](idnumber) column--either the SCTID value, or the Luminis Id value. The referenced [mdl_user](id) column value is now placed in the [enrol_shebang_person] table.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [https://moodle.org/plugins/view.php?plugin=enrol_shebang here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111190</id>
		<title>admin/setting/filtersettingrtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111190"/>
		<updated>2014-03-19T14:23:02Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&#039;&#039;&#039;Filter audio (.mp3)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enables/disables filtering for streamed audio links.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Filter video (.flv |.mp4 |.f4v | .mov)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Enables/disables filtering for video audio links.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Closed captions on by default&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Determines whether or not closed captioning plugins are loaded and displayed by default&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Additional Documentation==&lt;br /&gt;
[[Filters/rtmp]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111189</id>
		<title>admin/setting/filtersettingrtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111189"/>
		<updated>2014-03-19T14:19:49Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Filter audio (.mp3)&#039;&#039;&#039;&lt;br /&gt;
Enables/disables filtering for streamed audio links.&lt;br /&gt;
===&#039;&#039;&#039;Filter video (.flv |.mp4 |.f4v | .mov)&#039;&#039;&#039;===&lt;br /&gt;
Enables/disables filtering for video audio links.&lt;br /&gt;
===&#039;&#039;&#039;Closed captions on by default&#039;&#039;&#039;===&lt;br /&gt;
Determines whether or not closed captioning plugins are loaded and displayed by default&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Additional Documentation==&lt;br /&gt;
[[Filters/rtmp]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111188</id>
		<title>admin/setting/filtersettingrtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=admin/setting/filtersettingrtmp&amp;diff=111188"/>
		<updated>2014-03-19T14:13:18Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Admin settings for filter_rtmp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Admin settings Streaming media filter (RTMP)=&lt;br /&gt;
&lt;br /&gt;
* Filter audio (.mp3) - Enables/disables filtering for streamed audio links.&lt;br /&gt;
* Filter video (.flv |.mp4 |.f4v | .mov) - Enables/disables filtering for video audio links.&lt;br /&gt;
* Closed captions on by default - Determines whether or not closed captioning plugins are loaded and displayed by default&lt;br /&gt;
&lt;br /&gt;
Additional Documentation: [[Filters/rtmp]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=111181</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=111181"/>
		<updated>2014-03-19T13:48:29Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RTMP streaming media filter&#039;&#039;&#039; is used to replace links containing URLs beginning with rtmp:// with a Flowplayer media player using their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin]. It is contributed by [http://moodle.org/user/view.php?id=286444 Lacey Vickery] and [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Page output is examined for anchor href values beginning with rtmp:// and ending with a supported extension (currently .mp3, .mp4, .flv,, .f4v, and .mov). Qualifying links are replaced with a span tag containing &#039;data-&#039; prefixed attributes that are subsequently used by the plugin&#039;s JavaScript module to apply a Flowplayer player to the span. The Adobe Flash Player browser plugin is required.&lt;br /&gt;
&lt;br /&gt;
The plugin was developed to work with Adobe&#039;s Flash Media Server, but according to Flowplayer, their [http://flash.flowplayer.org/plugins/streaming/rtmp.html RTMP plugin] should work with Wowza, and Red5 as well. The plugin has been tested successfully with Amazon&#039;s Cloudfront streaming service.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the filter_rtmp.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the &#039;&#039;&#039;filter/&#039;&#039;&#039; folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
* Enable and configure the plugin (Site administration-&amp;gt;Plugins-&amp;gt;Filters-&amp;gt;Manage filters).&lt;br /&gt;
&lt;br /&gt;
=How to use=&lt;br /&gt;
In places where you can enter HTML (e.g. wysiwyg editor for topic summary, page resource, etc.), create a link and supply a URL that references the media stream you want to play. The URL would look something like: &#039;&#039;rtmp://fms.example.org/vod/classes/lecture01.flv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The file extensions filtered are: &#039;&#039;&#039;.flv, .mp4, .f4v, .mov, and .mp3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Cloudfront Streams==&lt;br /&gt;
Amazon&#039;s Cloudfront streaming requires the Flowplayer config values for netConnectionUrl, and the clip&#039;s URL to be slightly different. For streams originating at Cloudfront append the following query string paramter to the URL so the filter will adjust accordingly: &#039;&#039;&#039;?provider=acf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Playlists=&lt;br /&gt;
Support for playlists has been added (v1.3). Refer to the [[Playlist plugin]] docs.&lt;br /&gt;
&lt;br /&gt;
=Closed Captions=&lt;br /&gt;
Support for closed captioning has been added (v1.4). The filter can optionally load Flowplayer&#039;s [http://flash.flowplayer.org/plugins/flash/captions.html Captions] and [http://flash.flowplayer.org/plugins/flash/content.html Content] Flash plugins (.swf) to display closed captioning in the media player window. Even though Flowplayer&#039;s Caption plugin can load an external file containing the caption information, the filter does not yet provide for this method. The caption information must be embedded into the media file, such as an MP4 subtitles track, or FLV cuepoints.&lt;br /&gt;
&lt;br /&gt;
The filter has an additional site config to determine whether or not to load the Caption plugin by default. To override that default append the following query strting parameter to the URL: &#039;&#039;&#039;&#039;?captions=1&#039;&#039;&#039;&#039;, or &#039;&#039;&#039;&#039;captions=0&#039;&#039;&#039;&#039;, to load or not load the Captions plugin, respectively. These query string parameters are detected in playlists, so you can be selective about which clips in a playlist display closed captions.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=filter_rtmp here].&lt;br /&gt;
&lt;br /&gt;
=Source code=&lt;br /&gt;
The source code repository is located at github.com in the [http://github.com/appalachianstate/moodle-filter_rtmp appalachianstate/moodle-filter_rtmp] repository.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=106683</id>
		<title>SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=106683"/>
		<updated>2013-09-19T21:24:40Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: /* Important: Secure the target URL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import messages from a SunGard HE Banner/LMB (Luminis Message Broker) installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.3.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installation of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
&#039;&#039;&#039;THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [https://moodle.org/plugins/view.php?plugin=enrol_shebang here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=106603</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=106603"/>
		<updated>2013-09-12T14:58:15Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RTMP streaming media filter&#039;&#039;&#039; is used to replace links containing URLs beginning with rtmp:// with a Flowplayer media player using their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin]. It is contributed by [http://moodle.org/user/view.php?id=286444 Lacey Vickery] and [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Page output is examined for anchor href values beginning with rtmp:// and ending with a supported extension (currently .mp3, .mp4, .flv, and .f4v). Qualifying links are replaced with a div tag containing &#039;data-&#039; prefixed attributes that are subsequently used by the plugin&#039;s JavaScript module to apply a Flowplayer player to the div. The Adobe Flash Player browser plugin is required.&lt;br /&gt;
&lt;br /&gt;
The plugin was developed to work with Adobe&#039;s Flash Media Server, but according to Flowplayer, their [http://flash.flowplayer.org/plugins/streaming/rtmp.html RTMP plugin] should work with Wowza, and Red5 as well. The plugin has been tested successfully with Amazon&#039;s Cloudfront streaming service.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the filter_rtmp.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the &#039;&#039;&#039;filter/&#039;&#039;&#039; folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
* Enable and configure the plugin (Site administration-&amp;gt;Plugins-&amp;gt;Filters-&amp;gt;Manage filters).&lt;br /&gt;
&lt;br /&gt;
=How to use=&lt;br /&gt;
In places where you can enter HTML (e.g. wysiwyg editor for topic summary, page resource, etc.), create a link and supply a URL that references the media stream you want to play. The URL would look something like: &#039;&#039;rtmp://fms.example.org/vod/classes/lecture01.flv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The file extensions filtered are: &#039;&#039;&#039;.flv, .mp4, .f4v, and .mp3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Cloudfront Streams==&lt;br /&gt;
Amazon&#039;s Cloudfront streaming requires the Flowplayer config values for netConnectionUrl, and the clip&#039;s URL to be slightly different. For streams originating at Cloudfront append the following query string paramter to the URL so the filter will adjust accordingly: &#039;&#039;&#039;?provider=acf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Playlists=&lt;br /&gt;
Support for playlists has been added. Refer to the [[Playlist plugin]] docs.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=filter_rtmp here].&lt;br /&gt;
&lt;br /&gt;
=Source code=&lt;br /&gt;
The source code repository is located at github.com in the [http://github.com/appalachianstate/moodle-filter_rtmp appalachianstate/moodle-filter_rtmp] repository.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106602</id>
		<title>Playlist plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106602"/>
		<updated>2013-09-12T14:47:58Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Playlist resource plugin&#039;&#039;&#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp] plugin. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
To reference the playlist use the following form in a URL: rtmp://playlist=NAME, where &#039;NAME&#039; would be the appropriate playlist name. The filter_rtmp will then build a playlist appearing with the Flowplayer player. Video playlists will appear beside the player, and audio playlists will appear below the player. Titles for each clip can be entered in the list by appending them to the URL separated by a comma (,). If no title is supplied, it will be taken from the last segment of the URL.&lt;br /&gt;
&lt;br /&gt;
URLs are currently validated to allow only those beginning with &#039;&#039;&#039;rtmp://&#039;&#039;&#039;. To prevent circular references, URLs with a playlist reference are not allowed.&lt;br /&gt;
&lt;br /&gt;
Playlist resources (not the rendered Flowplayer playlist) are meant to be visible only to users with the editing teacher, or manager roles.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the mod_playlist.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the mod/ folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
&lt;br /&gt;
=How to use=&lt;br /&gt;
Create a playlist resource with the rtmp URLs.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist2.png]]&lt;br /&gt;
&lt;br /&gt;
Create a link somewhere that allows HTML (wysiwyg), e.g. a label, section/topic summary, page. In that link, reference the playlist.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist3.png]]&lt;br /&gt;
&lt;br /&gt;
The Flowplayer player and rendered playlist.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist.png]]&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=mod_playlist here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106601</id>
		<title>Playlist plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106601"/>
		<updated>2013-09-12T14:47:02Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Playlist resource plugin&#039;&#039;&#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp] plugin. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
To reference the playlist use the following form in a URL: rtmp://playlist=NAME, where &#039;NAME&#039; would be the appropriate playlist name. The filter_rtmp will then build a playlist appearing with the Flowplayer player. Video playlists will appear beside the player, and audio playlists will appear below the player. Titles for each clip can be entered in the list by appending them to the URL separated by a comma (,). If no title is supplied, it will be taken from the last segment of the URL.&lt;br /&gt;
&lt;br /&gt;
URLs are currently validated to allow only those beginning with &#039;&#039;&#039;rtmp://&#039;&#039;&#039;. To prevent circular references, URLs with a playlist reference are not allowed.&lt;br /&gt;
&lt;br /&gt;
Playlist resources (not the rendered Flowplayer playlist) are meant to be visible only to users with the editing teacher, or manager roles.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the mod_playlist.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the mod/ folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
&lt;br /&gt;
=Rendered Playlist=&lt;br /&gt;
Create a playlist resource with the rtmp URLs.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist2.png]]&lt;br /&gt;
&lt;br /&gt;
Create a link somewhere that allows HTML (wysiwyg), e.g. a label, section/topic summary, page. In that link, reference the playlist.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist3.png]]&lt;br /&gt;
&lt;br /&gt;
The Flowplayer player and rendered playlist.&lt;br /&gt;
&lt;br /&gt;
[[File:playlist.png]]&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=mod_playlist here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:playlist3.png&amp;diff=106600</id>
		<title>File:playlist3.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:playlist3.png&amp;diff=106600"/>
		<updated>2013-09-12T14:41:32Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: In a label, adding an rtmp link that references a playlist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In a label, adding an rtmp link that references a playlist&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106599</id>
		<title>Playlist plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106599"/>
		<updated>2013-09-12T14:37:42Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Playlist resource plugin&#039;&#039;&#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp] plugin. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
To reference the playlist use the following form in a URL: rtmp://playlist=NAME, where &#039;NAME&#039; would be the appropriate playlist name. The filter_rtmp will then build a playlist appearing with the Flowplayer player. Video playlists will appear beside the player, and audio playlists will appear below the player. Titles for each clip can be entered in the list by appending them to the URL separated by a comma (,). If no title is supplied, it will be taken from the last segment of the URL.&lt;br /&gt;
&lt;br /&gt;
URLs are currently validated to allow only those beginning with &#039;&#039;&#039;rtmp://&#039;&#039;&#039;. To prevent circular references, URLs with a playlist reference are not allowed.&lt;br /&gt;
&lt;br /&gt;
Playlist resources (not the rendered Flowplayer playlist) are meant to be visible only to users with the editing teacher, or manager roles.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the mod_playlist.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the mod/ folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
&lt;br /&gt;
=Rendered Playlist=&lt;br /&gt;
[[File:playlist2.png]][[File:playlist.png]]&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=mod_playlist here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:playlist2.png&amp;diff=106598</id>
		<title>File:playlist2.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:playlist2.png&amp;diff=106598"/>
		<updated>2013-09-12T14:32:07Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Creating a playlist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Creating a playlist&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106597</id>
		<title>Playlist plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106597"/>
		<updated>2013-09-12T14:01:09Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Playlist resource plugin&#039;&#039;&#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp] plugin. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
To reference the playlist use the following form in a URL: rtmp://playlist=NAME, where &#039;NAME&#039; would be the appropriate playlist name. The filter_rtmp will then build a playlist appearing with the Flowplayer player. Video playlists will appear beside the player, and audio playlists will appear below the player. Titles for each clip can be entered in the list by appending them to the URL separated by a comma (,). If no title is supplied, it will be taken from the last segment of the URL.&lt;br /&gt;
&lt;br /&gt;
URLs are currently validated to allow only those beginning with &#039;&#039;&#039;rtmp://&#039;&#039;&#039;. To prevent circular references, URLs with a playlist reference are not allowed.&lt;br /&gt;
&lt;br /&gt;
Playlist resources (not the rendered Flowplayer playlist) are meant to be visible only to users with the editing teacher, or manager roles.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the mod_playlist.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the mod/ folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
&lt;br /&gt;
=Rendered Playlist=&lt;br /&gt;
[[File:playlist.png]]&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=mod_playlist here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:playlist.png&amp;diff=106596</id>
		<title>File:playlist.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:playlist.png&amp;diff=106596"/>
		<updated>2013-09-12T13:59:28Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Example of filter_rtmp rendered playlist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example of filter_rtmp rendered playlist&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106595</id>
		<title>Playlist plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Playlist_plugin&amp;diff=106595"/>
		<updated>2013-09-12T13:56:23Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Created page with &amp;quot;The &amp;#039;&amp;#039;&amp;#039;Playlist resource plugin&amp;#039;&amp;#039;&amp;#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp]...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Playlist resource plugin&#039;&#039;&#039; is used to save a named set of rtmp URLs which can then be referenced by [http://moodle.org/plugins/view.php?plugin=filter_rtmp filter_rtmp] plugin. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
To reference the playlist use the following form in a URL: rtmp://playlist=NAME, where &#039;NAME&#039; would be the appropriate playlist name. The filter_rtmp will then build a playlist appearing with the Flowplayer player. Video playlists will appear beside the player, and audio playlists will appear below the player. Titles for each clip can be entered in the list by appending them to the URL separated by a comma (,). If no title is supplied, it will be taken from the last segment of the URL.&lt;br /&gt;
&lt;br /&gt;
URLs are currently validated to allow only those beginning with &#039;&#039;&#039;rtmp://&#039;&#039;&#039;. To prevent circular references, URLs with a playlist reference are not allowed.&lt;br /&gt;
&lt;br /&gt;
Playlist resources (not the rendered Flowplayer playlist) are meant to be visible only to users with the editing teacher, or manager roles.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the mod_playlist.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the mod/ folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
    &lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/plugins/view.php?plugin=mod_playlist here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=106594</id>
		<title>SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=106594"/>
		<updated>2013-09-12T13:22:11Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import messages from a SunGard HE Banner/LMB (Luminis Message Broker) installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.3.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installation of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin and shared with the Luminis admins.&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [https://moodle.org/plugins/view.php?plugin=enrol_shebang here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103442</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103442"/>
		<updated>2013-03-01T19:28:32Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Add How to use section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RTMP streaming media filter&#039;&#039;&#039; is used to replace links containing URLs beginning with rtmp:// with a Flowplayer media player using their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin]. It is contributed by [https://moodle.org/user/view.php?id=286444 Lacey Vickery] and [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for Moodle 2.3 and 2.4.&lt;br /&gt;
&lt;br /&gt;
Page output is examined for anchor href values beginning with rtmp:// and ending with a supported extension (currently .mp3, .mp4, and .flv). Qualifying links are replaced with a span tag containing &#039;data-&#039; prefixed attributes that are subsequently used by the plugin&#039;s JavaScript module to apply a Flowplayer player to the span. The Adobe Flash Player browser plugin is required.&lt;br /&gt;
&lt;br /&gt;
The plugin was developed to work with Adobe&#039;s Flash Media Server, but according to Flowplayer, their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin] should work with Wowza, and Red5 as well. The plugin has been tested successfully with Amazon&#039;s Cloudfront streaming service.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the filter_rtmp.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the &#039;&#039;&#039;filter/&#039;&#039;&#039; folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
* Enable and configure the plugin (Site administration-&amp;gt;Plugins-&amp;gt;Filters-&amp;gt;Manage filters).&lt;br /&gt;
&lt;br /&gt;
=How to use=&lt;br /&gt;
In places where you can enter HTML (e.g. wysiwyg editor for topic summary, page resource, etc.), create a link and supply a URL that references the media stream you want to play. The URL would look something like: &#039;&#039;rtmp://fms.example.org/vod/classes/lecture01.flv&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The file extensions filtered are: &#039;&#039;&#039;.flv, .mp4, and .mp3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Cloudfront Streams==&lt;br /&gt;
Amazon&#039;s Cloudfront streaming requires the Flowplayer config values for netConnectionUrl, and the clip&#039;s URL to be slightly different. For streams originating at Cloudfront append the following query string paramter to the URL so the filter will adjust accordingly: &#039;&#039;&#039;?provider=acf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [https://moodle.org/plugins/view.php?plugin=filter_rtmp here].&lt;br /&gt;
&lt;br /&gt;
=Source code=&lt;br /&gt;
The source code repository is located at github.com in the [https://github.com/appalachianstate/moodle-filter_rtmp appalachianstate/moodle-filter_rtmp] repository.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103435</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103435"/>
		<updated>2013-02-28T13:59:49Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: RTMP streaming media filter plugin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;RTMP streaming media filter&#039;&#039;&#039; is used to replace links containing URLs beginning with rtmp:// with a Flowplayer media player using their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin]. It is contributed by [https://moodle.org/user/view.php?id=286444 Lacey Vickery] and [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for Moodle 2.3 and 2.4.&lt;br /&gt;
&lt;br /&gt;
Page output is examined for anchor href values beginning with rtmp:// and ending with a supported extension (currently .mp3, .mp4, and .flv). Qualifying links are replaced with a span tag containing &#039;data-&#039; prefixed attributes that are subsequently used by the plugin&#039;s JavaScript module to apply a Flowplayer player to the span. The Adobe Flash Player browser plugin is required.&lt;br /&gt;
&lt;br /&gt;
The plugin was developed to work with Adobe&#039;s Flash Media Server, but according to Flowplayer, their [http://flash.flowplayer.org/plugins/streaming/rtmp.html rtmp plugin] should work with Wowza, and Red5 as well. The plugin has been tested successfully with Amazon&#039;s Cloudfront streaming service.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
* Select the correct version of the filter_rtmp.zip plugin for your Moodle installation.&lt;br /&gt;
* Unpack the .zip file into the &#039;&#039;&#039;filter/&#039;&#039;&#039; folder of your Moodle site.&lt;br /&gt;
* Access the notifications page (Site administration-&amp;gt;Notifications) to initiate installation.&lt;br /&gt;
* Enable and configure the plugin (Site administration-&amp;gt;Plugins-&amp;gt;Filters-&amp;gt;Manage filters).&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [https://moodle.org/plugins/view.php?plugin=filter_rtmp here].&lt;br /&gt;
&lt;br /&gt;
=Source code=&lt;br /&gt;
The source code repository is located at github.com in the [https://github.com/appalachianstate/moodle-filter_rtmp appalachianstate/moodle-filter_rtmp] repository.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103424</id>
		<title>Filters/rtmp</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Filters/rtmp&amp;diff=103424"/>
		<updated>2013-02-28T03:12:44Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: Created page with &amp;quot;The RTMP streaming media filter is used to replace links containing URLs beginning with rtmp:// with a Flowplayer player using their rtmp plugin.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The RTMP streaming media filter is used to replace links containing URLs beginning with rtmp:// with a Flowplayer player using their rtmp plugin.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=99308</id>
		<title>SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=99308"/>
		<updated>2012-07-18T19:34:35Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import messages from a SunGard HE Banner/LMB (Luminis Message Broker) installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.3.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installation of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin and shared with the Luminis admins.&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=85271</id>
		<title>SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=SHEBanG_plugin&amp;diff=85271"/>
		<updated>2011-06-17T15:50:17Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import messages from a SunGard HE Banner/LMB (Luminis Message Broker) installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.0.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installation of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin and shared with the Luminis admins.&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82916</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82916"/>
		<updated>2011-04-21T15:42:45Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin (beta)&#039;&#039;&#039; is designed to import messages from a SunGard HE Banner/LMB (Luminis Message Broker) installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.0. It is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82148</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82148"/>
		<updated>2011-03-21T18:10:10Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin (beta)&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.0. It is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
===Using Oracle===&lt;br /&gt;
If Oracle is being used, the NLS_DATE_FORMAT session setting has to be adjusted from the default. SHEBanG expects it to be set to &#039;YYYY-MM-DD HH24:MI:SS&#039;, but if that is not practical for your installation (conflicts with other plugins, etc.) then the format used by SHEBanG can be changed in the lib.php (DATEFMT_SQL_VALUE).&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82117</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82117"/>
		<updated>2011-03-21T01:40:53Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin (beta)&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard]. Versions are available for both Moodle 1.9 and 2.0. It is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82033</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=82033"/>
		<updated>2011-03-18T01:23:06Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin (beta)&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard], and was developed and tested in Moodle version 1.9.9; it is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;https://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76534</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76534"/>
		<updated>2010-10-06T16:41:10Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin (beta)&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard], and was developed and tested in Moodle version 1.9.9; it is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;http://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76532</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76532"/>
		<updated>2010-10-06T16:20:38Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard], and was developed and tested in Moodle version 1.9.9; it is currently designated &#039;&#039;&#039;beta&#039;&#039;&#039; because it has only been deployed in a QA/test environment, and not yet put into production by its author.&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;http://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76531</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76531"/>
		<updated>2010-10-06T16:11:05Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;http://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=Considerations For Blocking Issues=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76530</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76530"/>
		<updated>2010-10-06T16:10:34Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
=Why write a new one? Why reinvent?=&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
==Some other differences==&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the target URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;http://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===Important: Secure the target URL===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT THIS SHOULD NOT BE YOUR FIRST CHOICE. AGAIN, IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET (SSL) CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
=CONSIDERATIONS FOR BLOCKING ISSUES=&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
=How Entities are Associated and Referenced=&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
=Where to Find=&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76529</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76529"/>
		<updated>2010-10-06T16:01:48Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SHEBanG enrolment plugin&#039;&#039;&#039; is designed to import Luminis Message Broker (LMB) messages containing data sent from a SunGard HE Banner&amp;amp;reg; installation. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Messages are POSTed by LMB to a specified URL; that URL should end up resolving to enrol/shebang/secure/post.php either by means of direct address, symbolic link, or Apache server configuration (e.g. alias). An alternate method of import is the file upload feature.&lt;br /&gt;
&lt;br /&gt;
There already is an enrollment plugin, LMB, developed by [http://moodle.org/user/view.php?id=139623 Eric Merrill] that processes Banner data, and has many more configuration options and features. We have been using this plugin for several years at Appalachian State with only a few basic alterations.&lt;br /&gt;
&lt;br /&gt;
==Why write a new one? Why reinvent?==&lt;br /&gt;
There were a few reasons.&lt;br /&gt;
&lt;br /&gt;
In our particular installtion of Banner/LMB, we kept getting several essentially identical messages which resulted in duplicate rows in one of the staging tables. Normally not a big problem, but eventually the staging table becomes bloated with duplicates, and since this table is involved in JOINs where a singleton query result is expected. We also wanted to log each of the XML messages received, but not in the database; logging the messages in a text file is more practical for us.&lt;br /&gt;
 &lt;br /&gt;
Messages sent by the LMB are logged to the file-system in the Moodle data directory rather than the database; this message log file is locked exclusively while the message is being processed in order to serialize message processing.&lt;br /&gt;
&lt;br /&gt;
In the case where additional data from the XML message was needed, a regular expression had to be added--most often this is simple enough given an existing pattern from which to start, but in some instances where the message format changes ever so slightly (e.g. recstatus), it makes more sense to use DOMXPath queries to extract message data.&lt;br /&gt;
&lt;br /&gt;
XMLParser is used to break up the input, whether from file or posted XML, into the principle elements we want (&amp;lt;group&amp;gt;, &amp;lt;person&amp;gt;, and &amp;lt;membership&amp;gt;), and from that point use the DOMDocument and DOMXPath to query for the needed values.&lt;br /&gt;
&lt;br /&gt;
=Some other differences=&lt;br /&gt;
*Messages imported from a file are not logged since there&#039;s already a source file;&lt;br /&gt;
*A cross-list course parent is created only when the first &amp;lt;membership&amp;gt; message for that cross-list arrives, and then it will be created by making a copy of the child course.&lt;br /&gt;
*The Moodle user&#039;s idnumber column is populated with the SCTID/Banner userid, rather than the Luminis sourcedid/id.&lt;br /&gt;
*The only cron activity is the monitor for last message arrival time. Some Moodle sites may have a very frequent cron activity (5-10 min) so it didn&#039;t seem practical to put directory/file check tasks in a common script--rather use a dedicated cron task, if needed at all, for the Banner extract/batch-file imports.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
SHEBanG requires that PHP modules XMLParser, DOMDocument, and DOMXPath be loaded.&lt;br /&gt;
* Select the correct version of the &amp;quot;shebang.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the enrol folder of your Moodle site&lt;br /&gt;
* Access the notifications page (Admin block-&amp;gt;Notifications) to initiate database setup.&lt;br /&gt;
* Enable and configure the plugin (Courses-&amp;gt;Enrolments-&amp;gt;SHEBanG[Edit]).&lt;br /&gt;
* Configure your Banner/LMB to POST messages to the URL corresponding to the enrol/shebang/secure/post.php file, for example: &amp;lt;nowiki&amp;gt;http://moodle.someuniversity.edu/enrol/shebang/secure/post.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===I M P O R T A N T===&lt;br /&gt;
THIS URL NEEDS TO BE SECURED IN SOME FASHION TO PREVENT UNAUTHORIZED USERS FROM INJECTING ERRANT DATA INTO YOUR DATABASE. THE METHODS FOR SECURING THIS URL INCLUDE, BUT ARE NOT LIMITED TO, APACHE HTTP AUTH CONFIGURED--IDEALLY WITH SSL--AT THE SERVER/VHOST/DIRECTORY LEVEL OR WITH AN .htaccess FILE. ANOTHER OPTION, IS TO USE THE AUTHENTICATION FEATURE IN THE MODULE, BUT AGAIN IT IS STRONGLY RECOMMENDED TO USE A SECURE SOCKET CONNECTION IN ADDITION TO HTTP BASIC OR DIGEST AUTHENTICATION SINCE EITHER THE USERID/PWD INFORMATION WILL BE EXPOSED WHEN SENT IN CLEAR-TEXT (BASIC) OR THE HASH (DIGEST) WILL BE EXPOSED.&lt;br /&gt;
 &lt;br /&gt;
There is no Moodle authentication protection in the post.php since it is accessed by an external, non-interactive service where a userid/password will be configured by the Moodle server admin&lt;br /&gt;
and shared with the Luminis admins.&lt;br /&gt;
&lt;br /&gt;
==CONSIDERATIONS FOR BLOCKING ISSUES==&lt;br /&gt;
Because SHEBanG serializes message processing using a file lock, it is possible, in some cases likely, that a blocking bottleneck will take place when a large number of messages are sent by Banner/LMB at or near the same time. To mitigate the risk of the all the Apache worker processes being occupied and blocked, and thus freezing out the application end-users, consider setting up another Apache daemon to handle LMB messages exclusively on an alternate port such as 8080. In this way you can tailor the configured number of initial, max-min spare worker processes, etc., and if these processes should become consumed, the end-users will not be impacted.&lt;br /&gt;
 &lt;br /&gt;
==HOW ENTITIES ARE ASSOICATED AND REFERENCED==&lt;br /&gt;
*Courses&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_section] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the CRN) as the alternate key. This same value is placed in the [mdl_course](idnumber) column so that table can be queried directory. The course&#039;s (idnumber) value can not be changed after that or the association will be lost.&lt;br /&gt;
 &lt;br /&gt;
*Users&lt;br /&gt;
A staging record in the [mdl_enrol_shebang_person] table is inserted or updated, using the &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; value (the Luminis Id for that Banner identity, distinct from the Banner identity value). Susbsequent &amp;lt;membership&amp;gt; messages for this person will use this &amp;lt;sourcedid&amp;gt;&amp;lt;id&amp;gt; so we need to use this as an alternate identifying key value. A &amp;lt;person&amp;gt; message also contains the &amp;lt;userid useridtype=&amp;quot;SCTID&amp;quot;&amp;gt; value, the Banner identity, and it&#039;s this value that is placed in the [mdl_user] (idnumber) column.&lt;br /&gt;
 &lt;br /&gt;
So, upon arrival of a &amp;lt;person&amp;gt; message, and after the staging record is handled, the [mdl_user] table is queried on the (idnumber) column for the SCTID value--if no record is found, then an attempt is made to insert one, otherwise the found record is updated. Because other columns in the [mdl_user] table are unique (enforced either by the application or the database), a collision on email or username by prevent the insert. In such cases, manual inspection of the existing user account should be done to determine if it can be deleted (no access, no enrolments, etc.) or if it should be associated with the corresponding [mdl_enrol_shebang_person] row by placing the appropriate Banner identity value in the user&#039;s (idnumber) column.&lt;br /&gt;
&lt;br /&gt;
Until any such collision is resolved, course enrollments for that person/user will fail since no association exists between the person entity and the user entity.&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4264 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76499</id>
		<title>Development:SHEBanG plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:SHEBanG_plugin&amp;diff=76499"/>
		<updated>2010-10-06T03:38:51Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: SHEBanG enrolment plugin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SHEBanG enrolment plugin&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74335</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74335"/>
		<updated>2010-07-29T18:19:35Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to do an ad hoc import of user enrollments for a course from an uploaded text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are made using a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why Use This Plugin?==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts on the system (and no update of those user accounts is needed or desired).&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Move the Lang/Help files&lt;br /&gt;
** Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
** Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74334</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74334"/>
		<updated>2010-07-29T18:15:29Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to do an ad hoc import of user enrollments for a course from an uploaded text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are made using a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why Use This Plugin?==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts on the system (and no update of those user accounts is needed or desired).&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the .zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74333</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74333"/>
		<updated>2010-07-29T18:10:13Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: /* Where to Find */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why Use This Plugin?==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts on the system (and no update of those user accounts is needed or desired).&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74332</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74332"/>
		<updated>2010-07-29T18:08:53Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: /* Why This Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why Use This Plugin?==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts on the system (and no update of those user accounts is needed or desired).&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74283</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74283"/>
		<updated>2010-07-29T04:37:14Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why This Plugin==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74282</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74282"/>
		<updated>2010-07-29T04:33:17Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why This Plugin==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
==Where to Find==&lt;br /&gt;
The plugin can be found in the Modules and plugins database [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=4044 here].&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74281</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74281"/>
		<updated>2010-07-29T04:26:03Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why This Plugin==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Unpack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/import_userenrols.php file into the /lang/en_utf8 (or your preferred lang) directory of the Moodle site&lt;br /&gt;
* Copy the userenrols/lang/en_utf8/help/userenrols directory into the /lang/en_utf8/help directory of the Moodle site AND THEN RENAME IT TO import_userenrols&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74280</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74280"/>
		<updated>2010-07-29T03:53:41Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why This Plugin==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Uppack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Read the INSTALL.txt file for details on either installing a patch or copying the plugin&#039;s lang and help files&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74279</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74279"/>
		<updated>2010-07-29T03:52:42Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
==Why This Plugin==&lt;br /&gt;
Site administrators can accomplish the same task using the &amp;quot;Upload Users&amp;quot; interface from the Users-&amp;gt;Accounts menu. However, this plugin is meant to be used by a course instructor, or anyone who has the [moodle/role:assign] capability for a given course, to make any number of ad hoc manual enrollments of users who already have accounts.&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Uppack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Read the INSTALL.txt file for details on either installing a patch or copying the plugin&#039;s lang and help files&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74266</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74266"/>
		<updated>2010-07-28T23:45:49Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Uppack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Read the INSTALL.txt file for details on either installing a patch or moving the plugin&#039;s lang files&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74265</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74265"/>
		<updated>2010-07-28T23:44:32Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{userenrols}}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;userenrols course import plugin&#039;&#039;&#039; allows you to import user enrollments for a course from an uploaded delimited text file. It is contributed by [http://moodle.org/user/view.php?id=268334 Fred Woolard].&lt;br /&gt;
&lt;br /&gt;
Enrollments are associated with a selectable course role, and the plugin can optionally create course groups and assign the new enrollees to those groups.&lt;br /&gt;
&lt;br /&gt;
Each of the users listed in the input file must have an existing Moodle user account; new Moodle user accounts will not be created.&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the [http://moodle.org/mod/data/view.php?d=13&amp;amp;rid=3595 mass_enroll] course admin mod done by [http://moodle.org/user/view.php?id=69061 Patrick Pollet] and [http://moodle.org/user/view.php?id=34826 Valery Fremaux], using the standard groups course import plugin as a template.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
* Select the correct version of the &amp;quot;userenrols.zip&amp;quot; plugin for your Moodle installation&lt;br /&gt;
* Uppack the zip file into the course/import folder of your Moodle site&lt;br /&gt;
* Read the INSTALL.txt file for details on either installing a patch or moving the plugin&#039;s lang files&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74264</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74264"/>
		<updated>2010-07-28T22:37:21Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This course import plugin allows you to import user enrollments from an uploaded delimited text file. New user accounts will not be created, so each of the users listed in the input file must already have an account set up in the site. The course role into which new enrollments are made is selectable. Optionally, you also can assign imported users to course groups as part of the same import process.&lt;br /&gt;
&lt;br /&gt;
This plugin is a refactor of the mass_enroll course admin mod done by Patrick Pollet and Valery Fremaux, using the existing groups import plugin (Jamie Pratt &amp;amp; Tim Hunt ?) as a template.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74260</id>
		<title>Development:Userenrols plugin</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Userenrols_plugin&amp;diff=74260"/>
		<updated>2010-07-28T21:25:44Z</updated>

		<summary type="html">&lt;p&gt;Woolardfa: New page: The Userenrols course import plugin is used to make a large number of ad hoc manual enrollments in a course using an uploaded text containing the list of enrollees. The course role into wh...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Userenrols course import plugin is used to make a large number of ad hoc manual enrollments in a course using an uploaded text containing the list of enrollees. The course role into which new enrollments are made is selectable, and new course participants can be assigned into groups as part of the same import process.&lt;/div&gt;</summary>
		<author><name>Woolardfa</name></author>
	</entry>
</feed>