<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.inthewings.net/index.php?action=history&amp;feed=atom&amp;title=Acct-gen.pl</id>
	<title>Acct-gen.pl - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.inthewings.net/index.php?action=history&amp;feed=atom&amp;title=Acct-gen.pl"/>
	<link rel="alternate" type="text/html" href="http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;action=history"/>
	<updated>2026-05-06T07:27:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2186&amp;oldid=prev</id>
		<title>Jka at 17:38, 16 August 2007</title>
		<link rel="alternate" type="text/html" href="http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2186&amp;oldid=prev"/>
		<updated>2007-08-16T17:38:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 17:38, 16 August 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l229&quot; &gt;Line 229:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 229:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;sub newPass {&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;sub newPass {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Generate a random password&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Generate a random password&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;# Thanks to David Parks for this one&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     @chars = (&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;,&amp;quot;6&amp;quot;,&amp;quot;7&amp;quot;,&amp;quot;9&amp;quot;,&amp;quot;q&amp;quot;,&amp;quot;w&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;r&amp;quot;,&amp;quot;t&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;u&amp;quot;,&amp;quot;i&amp;quot;,&amp;quot;o&amp;quot;,&amp;quot;p&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;s&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;j&amp;quot;,&amp;quot;k&amp;quot;,&amp;quot;z&amp;quot;,&amp;quot;x&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;n&amp;quot;,&amp;quot;m&amp;quot;,&amp;quot;Q&amp;quot;,&amp;quot;W&amp;quot;,&amp;quot;E&amp;quot;,&amp;quot;R&amp;quot;,&amp;quot;T&amp;quot;,&amp;quot;Y&amp;quot;,&amp;quot;U&amp;quot;,&amp;quot;P&amp;quot;,&amp;quot;A&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;F&amp;quot;,&amp;quot;G&amp;quot;,&amp;quot;H&amp;quot;,&amp;quot;J&amp;quot;,&amp;quot;K&amp;quot;,&amp;quot;L&amp;quot;,&amp;quot;Z&amp;quot;,&amp;quot;X&amp;quot;,&amp;quot;C&amp;quot;,&amp;quot;V&amp;quot;,&amp;quot;N&amp;quot;,&amp;quot;M&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     @chars = (&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;,&amp;quot;6&amp;quot;,&amp;quot;7&amp;quot;,&amp;quot;9&amp;quot;,&amp;quot;q&amp;quot;,&amp;quot;w&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;r&amp;quot;,&amp;quot;t&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;u&amp;quot;,&amp;quot;i&amp;quot;,&amp;quot;o&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;              &lt;/ins&gt;&amp;quot;p&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;s&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;j&amp;quot;,&amp;quot;k&amp;quot;,&amp;quot;z&amp;quot;,&amp;quot;x&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;n&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;              &lt;/ins&gt;&amp;quot;m&amp;quot;,&amp;quot;Q&amp;quot;,&amp;quot;W&amp;quot;,&amp;quot;E&amp;quot;,&amp;quot;R&amp;quot;,&amp;quot;T&amp;quot;,&amp;quot;Y&amp;quot;,&amp;quot;U&amp;quot;,&amp;quot;P&amp;quot;,&amp;quot;A&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;F&amp;quot;,&amp;quot;G&amp;quot;,&amp;quot;H&amp;quot;,&amp;quot;J&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;              &lt;/ins&gt;&amp;quot;K&amp;quot;,&amp;quot;L&amp;quot;,&amp;quot;Z&amp;quot;,&amp;quot;X&amp;quot;,&amp;quot;C&amp;quot;,&amp;quot;V&amp;quot;,&amp;quot;N&amp;quot;,&amp;quot;M&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $newPassword = join(&amp;#039;&amp;#039;, &amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar);&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $newPassword = join(&amp;#039;&amp;#039;, &amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;                        &lt;/ins&gt;&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;                        &lt;/ins&gt;&amp;amp;RANDchar);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return $newPassword;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     return $newPassword;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jka</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2185&amp;oldid=prev</id>
		<title>Jka at 17:36, 16 August 2007</title>
		<link rel="alternate" type="text/html" href="http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2185&amp;oldid=prev"/>
		<updated>2007-08-16T17:36:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 17:36, 16 August 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l56&quot; &gt;Line 56:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 56:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$rdn            = &amp;quot;cn=slapman&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$rdn            = &amp;quot;cn=slapman&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$base           = &amp;quot;dc=hpc,dc=ufl,dc=edu&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$base           = &amp;quot;dc=hpc,dc=ufl,dc=edu&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$bindPasswd     = &amp;#039;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ch@sb0&lt;/del&gt;&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$bindPasswd     = &amp;#039;&amp;#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$searchBase     = &amp;quot;ou=People,&amp;quot; . $base;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$searchBase     = &amp;quot;ou=People,&amp;quot; . $base;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$dn = &amp;quot;uid=&amp;quot; . $userName . &amp;quot;,&amp;quot; . $searchBase;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$dn = &amp;quot;uid=&amp;quot; . $userName . &amp;quot;,&amp;quot; . $searchBase;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jka</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2184&amp;oldid=prev</id>
		<title>Jka at 17:35, 16 August 2007</title>
		<link rel="alternate" type="text/html" href="http://wiki.inthewings.net/index.php?title=Acct-gen.pl&amp;diff=2184&amp;oldid=prev"/>
		<updated>2007-08-16T17:35:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Still a little rough, but it does work. Autogenerates the UID given a GID,&lt;br /&gt;
# but since we have moved some people group wise this is bound to get&lt;br /&gt;
# a little odd looking.&lt;br /&gt;
&lt;br /&gt;
use Net::LDAP;&lt;br /&gt;
use Net::LDAP::Util;&lt;br /&gt;
use Net::SSH::Perl;&lt;br /&gt;
use Mail::Sendmail;&lt;br /&gt;
use LWP::Simple;&lt;br /&gt;
&lt;br /&gt;
$userName = $ARGV[0];&lt;br /&gt;
$uid = $userName;&lt;br /&gt;
&lt;br /&gt;
if (!$userName) {&lt;br /&gt;
    print &amp;quot;Usage: acct-gen.pl &amp;lt;username&amp;gt;\n&amp;quot;;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Get some data from the user&lt;br /&gt;
#&lt;br /&gt;
print &amp;quot;Email address: &amp;quot;;&lt;br /&gt;
$email = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
print &amp;quot;Name: &amp;quot;;&lt;br /&gt;
$name = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
# Go and print the list of groups available&lt;br /&gt;
#&lt;br /&gt;
print &amp;quot;Available Groups\n&amp;quot;;&lt;br /&gt;
print &amp;quot;================\n&amp;quot;;&lt;br /&gt;
&amp;amp;GetGroups;&lt;br /&gt;
print &amp;quot;================\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;GID: &amp;quot;;&lt;br /&gt;
$gid = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
#print &amp;quot;UID number: &amp;quot;;&lt;br /&gt;
#$uidNumber = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
$uidNumber = &amp;amp;getUID($gid);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Adding &amp;quot; . $userName . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;New uid Number: &amp;quot; . $uidNumber . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Organizational Units&lt;br /&gt;
print &amp;quot;\n&amp;quot;;&lt;br /&gt;
print &amp;quot;What Organizational Unit is this user in? (Department)\n&amp;quot;;&lt;br /&gt;
$OrgUnit = &amp;lt;STDIN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
# Boilerplate login data&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$ldapServer     = &amp;quot;ldap1.ufhpc&amp;quot;;&lt;br /&gt;
$rdn            = &amp;quot;cn=slapman&amp;quot;;&lt;br /&gt;
$base           = &amp;quot;dc=hpc,dc=ufl,dc=edu&amp;quot;;&lt;br /&gt;
$bindPasswd     = &amp;#039;ch@sb0&amp;#039;;&lt;br /&gt;
$searchBase     = &amp;quot;ou=People,&amp;quot; . $base;&lt;br /&gt;
$dn = &amp;quot;uid=&amp;quot; . $userName . &amp;quot;,&amp;quot; . $searchBase;&lt;br /&gt;
$BindDn = $rdn . &amp;quot;,&amp;quot; . $base;&lt;br /&gt;
&lt;br /&gt;
# Connect and bind to the LDAp server&lt;br /&gt;
#&lt;br /&gt;
$ldap = Net::LDAP-&amp;gt;new( $ldapServer );&lt;br /&gt;
&lt;br /&gt;
$bindDc         = $rdn . &amp;quot;,&amp;quot; . $base;&lt;br /&gt;
$mesg = $ldap-&amp;gt;bind( $BindDn, password =&amp;gt; $bindPasswd, version =&amp;gt; 3);&lt;br /&gt;
if ( $mesg-&amp;gt;is_error() ) {&lt;br /&gt;
  print &amp;quot;Error: bind failed.\n&amp;quot;;&lt;br /&gt;
  exit;&lt;br /&gt;
}&lt;br /&gt;
#&lt;br /&gt;
# Generate a new password&lt;br /&gt;
$newPassword = &amp;amp;newPass;&lt;br /&gt;
&lt;br /&gt;
# Testing Email&lt;br /&gt;
#&amp;amp;notifyMail($userName, $newPassword, $email);&lt;br /&gt;
#exit;&lt;br /&gt;
&lt;br /&gt;
# Generate creation and expiration dates for the password&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
$shadowLastChange = int(time / 86400);&lt;br /&gt;
$shadowExpire = $shadowLastChange + 180;&lt;br /&gt;
&lt;br /&gt;
# Have to chop these two because they have carriage returns after them.&lt;br /&gt;
# This causes havok in the gecos entry if we leave them in there.&lt;br /&gt;
chop $name;&lt;br /&gt;
chop $email;&lt;br /&gt;
&lt;br /&gt;
# Note that we force uidNumber and gidNumber to be of type int here. This&lt;br /&gt;
# is so that ldap doesn&amp;#039;t barf.&lt;br /&gt;
$result = $ldap-&amp;gt;add(dn =&amp;gt; $dn, &lt;br /&gt;
                     attr =&amp;gt; [ &amp;#039;uid&amp;#039; =&amp;gt; $uid,&lt;br /&gt;
                               &amp;#039;cn&amp;#039; =&amp;gt; $userName,&lt;br /&gt;
                               &amp;#039;userPassword&amp;#039; =&amp;gt; $newPassword,&lt;br /&gt;
                               &amp;#039;uidNumber&amp;#039; =&amp;gt; int($uidNumber),&lt;br /&gt;
                               &amp;#039;gidNumber&amp;#039; =&amp;gt; int($gid),&lt;br /&gt;
                               &amp;#039;gecos&amp;#039; =&amp;gt; $name . &amp;quot;, &amp;quot; . $email,&lt;br /&gt;
                               &amp;#039;loginShell&amp;#039; =&amp;gt; &amp;quot;/bin/bash&amp;quot;,&lt;br /&gt;
                               &amp;#039;homeDirectory&amp;#039; =&amp;gt; &amp;quot;/home/&amp;quot; . $userName,&lt;br /&gt;
                               &amp;#039;shadowLastChange&amp;#039; =&amp;gt; $shadowLastChange,&lt;br /&gt;
                               &amp;#039;shadowMin&amp;#039; =&amp;gt; 0,&lt;br /&gt;
                               &amp;#039;shadowMax&amp;#039; =&amp;gt; 180,&lt;br /&gt;
                               &amp;#039;shadowWarning&amp;#039; =&amp;gt; 7,&lt;br /&gt;
                               &amp;#039;shadowInactive&amp;#039; =&amp;gt; 30,&lt;br /&gt;
                               &amp;#039;shadowFlag&amp;#039; =&amp;gt; 0,&lt;br /&gt;
                               &amp;#039;shadowExpire&amp;#039; =&amp;gt; $shadowExpire,&lt;br /&gt;
                               &amp;#039;ou&amp;#039; =&amp;gt; $OrgUnit,&lt;br /&gt;
                               &amp;#039;objectClass&amp;#039; =&amp;gt; [ &amp;#039;top&amp;#039;,&lt;br /&gt;
                                                &amp;#039;account&amp;#039;,&lt;br /&gt;
                                                &amp;#039;posixAccount&amp;#039;,&lt;br /&gt;
                                                &amp;#039;shadowAccount&amp;#039;&lt;br /&gt;
                                                ]]);&lt;br /&gt;
&lt;br /&gt;
if ($result-&amp;gt;is_error()) {&lt;br /&gt;
    print &amp;quot;\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;Creations error: &amp;quot; . $result-&amp;gt;error_name . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    print $result-&amp;gt;error_text . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    print $result-&amp;gt;error_desc . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    print $result-&amp;gt;error . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Account created with password: &amp;quot; . $newPassword . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# And then we need to add this home directory into autofs&lt;br /&gt;
#system(&amp;quot;scp racksrv:/opt/cluster/config/auto.home auto.home&amp;quot;);&lt;br /&gt;
&amp;amp;genAutoHome($userName);&lt;br /&gt;
&lt;br /&gt;
# Now we need to go and create the home directory for this person.&lt;br /&gt;
&amp;amp;genHome($userName,$gid,$newPassword);&lt;br /&gt;
&lt;br /&gt;
# Next we send out an email detailing the account.&lt;br /&gt;
&amp;amp;notifyMail($userName,$newPassword,$email);&lt;br /&gt;
&lt;br /&gt;
# Subscribe them to Bugzilla&lt;br /&gt;
&amp;amp;genBugzilla($email, $name);&lt;br /&gt;
&lt;br /&gt;
# And finally, add them to the gridusers mailing list&lt;br /&gt;
&amp;amp;genGridUsers($email);&lt;br /&gt;
# Copying over auto.home&lt;br /&gt;
#print &amp;quot;Copying over auto.home to racksrv.\n&amp;quot;;&lt;br /&gt;
#system(&amp;quot;scp auto.home racksrv:/opt/cluster/config/auto.home&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Account creation completed\n&amp;quot;;&lt;br /&gt;
exit;&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
##########################################################################&lt;br /&gt;
## END MAIN PROGRAM END MAIN PROGRAM END MAIN PROGRAM END MAIN PROGRAM ###&lt;br /&gt;
##########################################################################&lt;br /&gt;
##########################################################################&lt;br /&gt;
&lt;br /&gt;
sub genBugzilla($email, $name) {&lt;br /&gt;
    my $name2 = $name;&lt;br /&gt;
    $name2 =~ s/ /\%20/g;&lt;br /&gt;
    my $url = &amp;#039;http://bugzilla.hpc.ufl.edu/createaccount.cgi?login=&amp;#039; . &lt;br /&gt;
        $email . &amp;#039;&amp;amp;realname=&amp;#039; . $name2;&lt;br /&gt;
    print $url . &amp;quot;\n&amp;quot;;&lt;br /&gt;
    my $content = get $url;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub genGridUsers($email) {&lt;br /&gt;
    $add_members = &amp;quot;/usr/lib/mailman/bin/add_members&amp;quot;;&lt;br /&gt;
# We have to do it this way because hpc manages the mailing list.&lt;br /&gt;
    system(&amp;quot;ssh hpc.ufhpc &amp;#039;echo $email &amp;gt; /tmp/email.txt&amp;#039;&amp;quot;);&lt;br /&gt;
    system(&amp;quot;ssh hpc.ufhpc $add_members -r /tmp/email.txt gridusers&amp;quot;);&lt;br /&gt;
    system(&amp;quot;ssh hpc.ufhpc rm /tmp/email.txt&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub RANDchar{&lt;br /&gt;
    $i = rand();&lt;br /&gt;
    $i *= 52;&lt;br /&gt;
    $i = int($i);&lt;br /&gt;
    return @chars[$i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetGroups{&lt;br /&gt;
    $ldapServer = &amp;quot;ldap1.ufhpc&amp;quot;;&lt;br /&gt;
    $base = &amp;quot;dc=hpc,dc=ufl,dc=edu&amp;quot;;&lt;br /&gt;
    $searchBase = &amp;quot;ou=Group,&amp;quot; . $base;&lt;br /&gt;
    &lt;br /&gt;
    $ldap = Net::LDAP-&amp;gt;new($ldapServer);&lt;br /&gt;
    $mesg = $ldap-&amp;gt;bind();&lt;br /&gt;
    if ($mesg-&amp;gt;is_error()) {&lt;br /&gt;
        print &amp;quot;Error: bind failed.\n&amp;quot;;&lt;br /&gt;
        exit;&lt;br /&gt;
    }&lt;br /&gt;
    $result = $ldap-&amp;gt;search(filter=&amp;gt;&amp;quot;(cn=*)&amp;quot;,&lt;br /&gt;
                            base=&amp;gt;$searchBase,&lt;br /&gt;
                            attrs=&amp;gt; [&amp;#039;gidNumber&amp;#039;, &amp;#039;cn&amp;#039;] );&lt;br /&gt;
    while( my $entry = $result-&amp;gt;shift_entry) {&lt;br /&gt;
        foreach my $attr ($entry-&amp;gt;attributes) {&lt;br /&gt;
            foreach my $value ($entry-&amp;gt;get_value($attr)) {&lt;br /&gt;
                print $value, &amp;quot; &amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    print &amp;quot;\n&amp;quot;;&lt;br /&gt;
    $mesg = $ldap-&amp;gt;unbind();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub getUID($gid) {&lt;br /&gt;
    # Make the uid we are returning at least as high as the gid, so that if&lt;br /&gt;
    # this is a new group it will automatically be incremented by one to the&lt;br /&gt;
    # gid + 1.&lt;br /&gt;
    $highest = $gid; &lt;br /&gt;
    setpwent; # Initialize passwd entry scan&lt;br /&gt;
    while (@list = getpwent) { # fetch the next entry&lt;br /&gt;
        if ($gid == @list[3]) {&lt;br /&gt;
            if (@list[2] &amp;gt; $highest) {&lt;br /&gt;
                $highest = @list[2];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    $highest+=1;&lt;br /&gt;
    # Check to be sure that we aren&amp;#039;t overwriting something here...&lt;br /&gt;
    while (getpwuid($highest)) {&lt;br /&gt;
#       print &amp;quot;Bad UID (&amp;quot; . $highest . &amp;quot;) Moving to next one!\n&amp;quot;;&lt;br /&gt;
        $highest+=1;&lt;br /&gt;
    }&lt;br /&gt;
    return $highest;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub newPass {&lt;br /&gt;
# Generate a random password&lt;br /&gt;
#&lt;br /&gt;
    @chars = (&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;,&amp;quot;6&amp;quot;,&amp;quot;7&amp;quot;,&amp;quot;9&amp;quot;,&amp;quot;q&amp;quot;,&amp;quot;w&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;r&amp;quot;,&amp;quot;t&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;u&amp;quot;,&amp;quot;i&amp;quot;,&amp;quot;o&amp;quot;,&amp;quot;p&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;s&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;j&amp;quot;,&amp;quot;k&amp;quot;,&amp;quot;z&amp;quot;,&amp;quot;x&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;v&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;n&amp;quot;,&amp;quot;m&amp;quot;,&amp;quot;Q&amp;quot;,&amp;quot;W&amp;quot;,&amp;quot;E&amp;quot;,&amp;quot;R&amp;quot;,&amp;quot;T&amp;quot;,&amp;quot;Y&amp;quot;,&amp;quot;U&amp;quot;,&amp;quot;P&amp;quot;,&amp;quot;A&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;F&amp;quot;,&amp;quot;G&amp;quot;,&amp;quot;H&amp;quot;,&amp;quot;J&amp;quot;,&amp;quot;K&amp;quot;,&amp;quot;L&amp;quot;,&amp;quot;Z&amp;quot;,&amp;quot;X&amp;quot;,&amp;quot;C&amp;quot;,&amp;quot;V&amp;quot;,&amp;quot;N&amp;quot;,&amp;quot;M&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $newPassword = join(&amp;#039;&amp;#039;, &amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar,&amp;amp;RANDchar);&lt;br /&gt;
    return $newPassword;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Generate a home directory on submit. Right now this uses a script located on&lt;br /&gt;
# submit that should really be implanted here.&lt;br /&gt;
sub genHome($userName, $gid, $newPassword) {&lt;br /&gt;
    $homedir = &amp;quot;/ufhpc/racksrv/home&amp;quot;;&lt;br /&gt;
    $scmd = &amp;quot;ssh -x submit&amp;quot;;&lt;br /&gt;
#    system(&amp;quot;$scmd mkdir $homedir/$userName&amp;quot;);&lt;br /&gt;
#    system(&amp;quot;$scmd mkdir $homedir/$userName/.ssh&amp;quot;);&lt;br /&gt;
#    system(&amp;quot;$scmd ssh-keygen -t rsa -f $homedir/$userName/.ssh/id_rsa -N \&amp;#039;\&amp;#039;&amp;quot;);&lt;br /&gt;
#    system(&amp;quot;$scmd cp $homedir/$userName/.ssh/id_rsa.pub $homedir/$userName/.ssh/authorized_keys&amp;quot;);&lt;br /&gt;
#    system(&amp;quot;$scmd cp /etc/skel/.[a-z]* $homedir/$userName/&amp;quot;);&lt;br /&gt;
#    system(&amp;quot;$scmd chown -R $userName.$gid $homedir/$userName&amp;quot;);&lt;br /&gt;
    $stuff = &amp;quot;$scmd /usr/local/bin/acct-gen $homedir/$userName $userName $gid&amp;quot;;&lt;br /&gt;
    system($stuff);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Generate the autohome entry and get it fired off into ldap.&lt;br /&gt;
#&lt;br /&gt;
sub genAutoHome($userName) {&lt;br /&gt;
    $autohome = &amp;quot;/opt/cluster/config/auto.home&amp;quot;;&lt;br /&gt;
    $location = &amp;quot;\${HOST}:/ufhpc/racksrv/home/&amp;quot;;&lt;br /&gt;
    open(AUTOFILE, &amp;quot;&amp;gt;&amp;gt;$autohome&amp;quot;) ||&lt;br /&gt;
        die &amp;quot;Could not open \$autohome\n&amp;quot;;&lt;br /&gt;
    printf AUTOFILE &amp;quot;%-17s%s%s\n&amp;quot;, $userName, $location, $userName; &lt;br /&gt;
    close(AUTOFILE);&lt;br /&gt;
    system(&amp;quot;cd /opt/cluster/config; ./mkautomount auto.home&amp;quot;);&lt;br /&gt;
    system(&amp;quot;touch /opt/cluster/config/.auto.home.ts&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generate and send an email to the new user detailing the account&lt;br /&gt;
#     &lt;br /&gt;
sub notifyMail($userName, $newPassword, $email) {&lt;br /&gt;
    $text = &amp;lt;&amp;lt;END_OF_BODY;&lt;br /&gt;
Your account for the HPC cluster has been created. All jobs are to be&lt;br /&gt;
submitted using the Torque batch systems.  Links to the Torque documentation &lt;br /&gt;
is located here:&lt;br /&gt;
&lt;br /&gt;
http://wiki.hpc.ufl.edu/index.php/Job_Submission_Queues&lt;br /&gt;
&lt;br /&gt;
Other documentation can also be seen at the wiki pages:&lt;br /&gt;
&lt;br /&gt;
http://wiki.hpc.ufl.edu &lt;br /&gt;
&lt;br /&gt;
Your login credentials are as follow:&lt;br /&gt;
&lt;br /&gt;
Username: $userName&lt;br /&gt;
Password: $newPassword&lt;br /&gt;
&lt;br /&gt;
The machine to use for logins via ssh is submit.hpc.ufl.edu. As a note,&lt;br /&gt;
any data that is stored on HPC systems is not backed up, and therefore&lt;br /&gt;
there is no guarantee that your data will be protected.&lt;br /&gt;
&lt;br /&gt;
A bugzilla account has also been created, and the password for that account&lt;br /&gt;
has been sent to you seperately. &lt;br /&gt;
&lt;br /&gt;
If you have any questions, please let us know via email or through a bug&lt;br /&gt;
report using bugzilla:&lt;br /&gt;
&lt;br /&gt;
http://bugzilla.hpc.ufl.edu/&lt;br /&gt;
END_OF_BODY&lt;br /&gt;
&lt;br /&gt;
%mail = (&lt;br /&gt;
         from =&amp;gt; &amp;#039;support@hpc.ufl.edu&amp;#039;,&lt;br /&gt;
         to =&amp;gt; $email,&lt;br /&gt;
         subject =&amp;gt; &amp;#039;HPC Account&amp;#039;&lt;br /&gt;
         );&lt;br /&gt;
    $mail{body}=$text;&lt;br /&gt;
    &lt;br /&gt;
    sendmail(%mail) || print &amp;quot;Error in sending email to user\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jka</name></author>
		
	</entry>
</feed>