<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Prune&#039;s Blog &#187; Linux</title>
	<atom:link href="http://www.lecentre.net/blog/archives/category/unix/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lecentre.net/blog</link>
	<description>Internet, UNIX, Video, Leisure...</description>
	<lastBuildDate>Thu, 19 Jan 2012 20:38:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Syslog LogAnalyzer with LDAP authentication</title>
		<link>http://www.lecentre.net/blog/archives/1328</link>
		<comments>http://www.lecentre.net/blog/archives/1328#comments</comments>
		<pubDate>Thu, 19 Jan 2012 20:38:44 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[adiscon]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[loganalyzer]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rsyslog]]></category>
		<category><![CDATA[syslog]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=1328</guid>
		<description><![CDATA[&#160; &#160; Adiscon is the company responsible for developping LogAnalyzer, a syslog (rsyslog, syslog-ng&#8230;) and/or flat file &#171;&#160;analyzer&#160;&#187;. By analyzer, understand that it enables you to display the log in a meaningful way, splitting it depending on &#171;&#160;views&#160;&#187; and enabling real search filters. If you don&#8217;t have the money for things liks Splunk and you [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="adiscon LogAnalyzer" src="http://loganalyzer.adiscon.com/wp-content/themes/loganalyzer/log-analyzer-logo.gif" alt="" width="274" height="68" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Adiscon is the company responsible for developping LogAnalyzer, a syslog (rsyslog, syslog-ng&#8230;) and/or flat file &laquo;&nbsp;analyzer&nbsp;&raquo;.<br />
By analyzer, understand that it enables you to display the log in a meaningful way, splitting it depending on &laquo;&nbsp;views&nbsp;&raquo; and enabling real search filters.</p>
<p>If you don&#8217;t have the money for things liks Splunk and you are not convinces by other new projects using Rails, NoSQL and other tools that are a pain in the ass to install, you may fallback to LogAnalyzer.<br />
<span id="more-1328"></span><br />
Loganalyzer is a LAMP (Apache, PHP, Mysql) application. Installing it is as easy as putting the PHP files in you web Documentroot and browse to it. You will be asked a few questions and you can start importing your log files.</p>
<p>To do that you need to create &laquo;&nbsp;sources&nbsp;&raquo; of data. A source can now be a flat file on the local disk or a database (Mysql).<br />
The choice for us was to use rSyslog on our servers. rSyslog is installed on every UNIX host. It is then configured to send the logs to a &laquo;&nbsp;loghost&nbsp;&raquo; server.<br />
Additionaly, on some hosts, flat files like the Apache access_log or Error_log are also sent by rSyslog.<br />
This lead to a client rsyslog.conf like :</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#rsyslog v3 config file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># if you experience problems, check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># http://www.rsyslog.com/troubleshoot for assistance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#### MODULES ####</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imuxsock<span class="sy0">.</span>so    <span class="co2"># provides support for local system logging (e.g. via logger command)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imklog<span class="sy0">.</span>so      <span class="co2"># provides kernel logging support (previously done by rklogd)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#$ModLoad immark.so     # provides &#8211;MARK&#8211; message capability</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> omrelp<span class="sy0">.</span>so      <span class="co2"># load RELP output module to send logs using RELP instead of UDP-TCP</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imfile         <span class="co2"># load the file input module to scan specific log files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#### GLOBAL DIRECTIVES ####</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Use default timestamp format</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionFileDefaultTemplate</span> RSYSLOG_TraditionalFileFormat</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># File syncing capability is disabled by default. This feature is usually not required,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># not useful and an extreme performance hit</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#$ActionFileEnableSync on</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#### File Input module ####</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputFileName</span> <span class="sy0">/</span>opt<span class="sy0">/</span>app<span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>mylog<span class="sy0">.</span>xml</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputFileTag</span> mylog<span class="sy0">.</span>xml<span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputFileStateFile</span> mylog<span class="sy0">.</span>xml</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputFileFacility</span> local5</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputFileSeverity</span> notice</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputRunFileMonitor</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#### RULES ####</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$template</span> TraditionalFormatWithPRI<span class="sy0">,</span><span class="st0">&quot;%PRI-text%: %timegenerated% %HOSTNAME% <span class="es6">%s</span>yslogtag<span class="es6">%%</span>msg:::drop-last-lf%<span class="es1">\n</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log all kernel messages to the console.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Logging much else clutters up the screen.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#kern.* /dev/console</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log anything (except mail) of level info or higher.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Don&#8217;t log private authentication messages!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.</span>info<span class="sy0">;</span>mail<span class="sy0">.</span>none<span class="sy0">;</span>authpriv<span class="sy0">.</span>none<span class="sy0">;</span>cron<span class="sy0">.</span>none<span class="sy0">;</span>local5<span class="sy0">.!</span>notice <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>messages<span class="sy0">;</span>TraditionalFormatWithPRI</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># The authpriv file has restricted access.</span></div>
</li>
<li class="li1">
<div class="de1">authpriv<span class="sy0">.*</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>secure</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log all the mail messages in one place.</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/mail"><span class="kw3">mail</span></a><span class="sy0">.*</span> <span class="sy0">-/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>maillog</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log cron stuff</span></div>
</li>
<li class="li1">
<div class="de1">cron<span class="sy0">.*</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>cron</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Everybody gets emergency messages</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.</span>emerg <span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Save news errors of level crit and higher in a special file.</span></div>
</li>
<li class="li1">
<div class="de1">uucp<span class="sy0">,</span>news<span class="sy0">.</span>crit <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>spooler</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Save boot messages also to boot.log</span></div>
</li>
<li class="li1">
<div class="de1">local7<span class="sy0">.*</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>boot<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># ### begin forwarding rule ###</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># The statement between the begin &#8230; end define a SINGLE forwarding</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># rule. They belong together, do NOT split them. If you create multiple</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># forwarding rules, duplicate the whole block!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Remote Logging (we use TCP for reliable delivery)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># An on-disk queue is created for this action. If the remote host is</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># down, messages are spooled to disk and sent when it is up again.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$WorkDirectory</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span>spool<span class="sy0">/</span>rsyslog <span class="co2"># where to place spool files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueFileName</span> fwdRule1 <span class="co2"># unique name prefix for spool files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueMaxDiskSpace</span> 1g <span class="co2"># 1gb space limit (use as much as possible)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueSaveOnShutdown</span> on <span class="co2"># save messages to disk on shutdown</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueType</span> LinkedList <span class="co2"># run asynchronously</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionResumeRetryCount</span> <span class="sy0">-</span><span class="nu0">1</span> <span class="co2"># infinite retries if host is down</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.*</span> <span class="sy0">@@</span>loghost<span class="sy0">:</span><span class="nu0">514</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#*.* <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mrelp:loghost:20514;RSYSLOG_ForwardFormat</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># ### end of the forwarding rule ###</span></div>
</li>
</ol>
</div>
</div>
<p>On the server (receiver) side, the rSyslog will put data into files, rotating every day, and inside the DB.<br />
Actualy I don&#8217;t know yet if it is a good idea. For the moment I keep everything. I may consider archiving the flat files and deleting old logs from the DB.<br />
Then the DB would act as a buffer to search and correlate.</p>
<p>This is the server rsyslog.conf :</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2"># if you experience problems, check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># http://www.rsyslog.com/troubleshoot for assistance</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># rsyslog v3: load input modules</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># If you do not load inputs, nothing happens!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># You may need to set the module load path if modules are not found.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># stats module &#8211; experimental</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># supprimer pour la mise en prod</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> impstats</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$PStatInterval</span> 600</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$PStatSeverity</span> 7</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/syslog"><span class="kw3">syslog</span></a><span class="sy0">.</span>debug <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>rsyslog<span class="sy0">-</span>stats</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> immark <span class="co2"># provides &#8211;MARK&#8211; message capability</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imuxsock <span class="co2"># provides support for local system logging (e.g. via logger command)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imklog <span class="co2"># kernel logging (formerly provided by rklogd)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> ommysql <span class="co2"># locad Mysql backend module</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$WorkDirectory</span> <span class="sy0">/</span>opt<span class="sy0">/</span>rsyslog<span class="sy0">/</span>work <span class="co2"># default location for work (spool) files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Templates</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$template</span> RemoteHost<span class="sy0">,</span><span class="st0">&quot;/opt/rsyslog/data/%<span class="es4">$YEAR</span>%/%<span class="es4">$MONTH</span>%/%<span class="es4">$DAY</span>%/%HOSTNAME%/<span class="es6">%s</span>yslogfacility-text%.log&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># used for Cisco, vanilla syslog when we can&#8217;t parse host name</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$template</span> RemoteFromHost<span class="sy0">,</span><span class="st0">&quot;/opt/rsyslog/data/<span class="es6">%F</span>ROMHOST%/%<span class="es4">$YEAR</span>%/%<span class="es4">$MONTH</span>%/%<span class="es4">$DAY</span>%/<span class="es6">%s</span>yslogfacility-text%.log&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># ######### Receiving Messages from local host only ##########</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log all kernel messages to the console.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Logging much else clutters up the screen.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#kern.* /dev/console</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log anything (except mail) of level info or higher.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Don&#8217;t log private authentication messages!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.</span>info<span class="sy0">;</span>mail<span class="sy0">.</span>none<span class="sy0">;</span>authpriv<span class="sy0">.</span>none<span class="sy0">;</span>cron<span class="sy0">.</span>none <span class="sy0">-/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>messages</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># The authpriv file has restricted access.</span></div>
</li>
<li class="li1">
<div class="de1">authpriv<span class="sy0">.*</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>secure</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log all the mail messages in one place.</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/mail"><span class="kw3">mail</span></a><span class="sy0">.*</span> <span class="sy0">-/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>maillog</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Log cron stuff</span></div>
</li>
<li class="li1">
<div class="de1">cron<span class="sy0">.*</span> <span class="sy0">-/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>cron</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Everybody gets emergency messages</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.</span>emerg <span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Save news errors of level crit and higher in a special file.</span></div>
</li>
<li class="li1">
<div class="de1">uucp<span class="sy0">,</span>news<span class="sy0">.</span>crit <span class="sy0">-/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>spooler</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Save boot messages also to boot.log</span></div>
</li>
<li class="li1">
<div class="de1">local7<span class="sy0">.*</span> <span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span><a href="http://www.php.net/log"><span class="kw3">log</span></a><span class="sy0">/</span>boot<span class="sy0">.</span><a href="http://www.php.net/log"><span class="kw3">log</span></a></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># ######### Receiving Messages from Remote Hosts ##########</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># at this point, we consider only remote messages</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$RuleSet</span> remote</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># TCP Syslog Server:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># provides TCP syslog reception and GSS-API (if compiled to support it)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imtcp<span class="sy0">.</span>so <span class="co2"># load module</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputTCPServerBindRuleset</span> remote</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputTCPServerRun</span> <span class="nu0">514</span> <span class="co2"># start up TCP listener at port 514</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># TCP Syslog Server for Cisco &#8211; need port over 1024 :</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># provides TCP syslog reception and GSS-API (if compiled to support it)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imtcp<span class="sy0">.</span>so <span class="co2"># load module</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputTCPServerBindRuleset</span> remote</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputTCPServerRun</span> <span class="nu0">1470</span> <span class="co2"># start up TCP listener at port 514</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># UDP Syslog Server:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imudp<span class="sy0">.</span>so <span class="co2"># provides UDP syslog reception</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputUDPServerBindRuleset</span> remote</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$UDPServerRun</span> <span class="nu0">514</span> <span class="co2"># start a UDP syslog server at standard port 514</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># RELP Syslog (Reliable Event Logging Protocol)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># WARNING : RELP messages are not passed through ruleset yet and will be logged localy</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ModLoad</span> imrelp <span class="co2"># load RELP input module to send reliable messages &#8211; better than TCP and UDP</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$InputRELPServerRun</span> <span class="nu0">20514</span> <span class="co2"># RELP port on 20514</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># #########</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># log remote hosts to specific files</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueType</span> LinkedList <span class="co2"># use asynchronous processing</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionQueueFileName</span> dbq <span class="co2"># set file name, also enables disk mode</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ActionResumeRetryCount</span> <span class="sy0">-</span><span class="nu0">1</span> <span class="co2"># infinite retries on insert failure</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.*</span> <span class="sy0">-</span>?RemoteHost</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># log everything to mysql using default template</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#*.* <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mmysql:database-server,database-name,database-userid,database-password</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#*.* <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> mmysql:localhost,loganalyzer,rsyslog,password</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># syslog-ng style template used by centreon-syslog</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$template</span> sysMysql<span class="sy0">,</span><span class="st0">&quot;INSERT INTO logs (host,facility, priority,level,tag,datetime,program,msg,ProcessID) VALUES (&#8216;%HOSTNAME%&#8217;,&#8217;<span class="es6">%s</span>yslogfacility%&#8217;,&#8217;<span class="es6">%s</span>yslogpriority%&#8217;,&#8217;<span class="es6">%s</span>yslogseverity%&#8217;,&#8217;<span class="es6">%s</span>yslogtag%&#8217;, &#8216;%timereported:::date-mysql%&#8217;,'%programname%&#8217;, &#8216;%msg%&#8217;,'%procid:R,ERE,0,ZERO:[0-9]+&#8211;end%&#8217;)&quot;</span><span class="sy0">,</span> SQL</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*.*</span> <span class="sy0">:</span>ommysql<span class="sy0">:</span>localhost<span class="sy0">,</span>loganalyzer<span class="sy0">,</span>rsyslog<span class="sy0">,</span>password<span class="sy0">;</span>sysMysql</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># END remote logging</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#</span></div>
</li>
</ol>
</div>
</div>
<p>On the mysql side you will need to install the syslog-ng database schema. Mine is changed to also support ProcessID. (I will join the schema soon).<br />
On the Loganalyzer side you need to define sources and views.<br />
Sources will define which data source to use&#8230; flat file, mysql&#8230;<br />
To be able to use Mysql you will need to also create (or use the provided) DBMapping. This will match the DB fields to the Syslog Fields.<br />
Finaly, the &laquo;&nbsp;view&nbsp;&raquo; will decide which fields to display. For example, you could decide to display only the date and message of the error logs in a view because the hostname is not usefull. In another view you could decide that the date is not important but the host is, with the HTTP status code&#8230;</p>
<p>OK. You are all set-up with Loganalyzer&#8230; but you can only log-in with users from the mysql database.<br />
My users are in LDAP.<br />
While it would be hard to change the whole application to authenticate and search the groups in LDAP, the authentication part is easy to do.<br />
I just changed the functions_users.php so, instead of looking the user in the DB, do the auth on LDAP, create the user in the DB and continue with the normal behaviour&#8230;</p>
<p>Here is the code of the new function in <strong>include/functions_users.php</strong> :</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> CheckLDAPUserLogin<span class="br0">&#40;</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">global</span> <span class="re0">$content</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$ldap_filter</span><span class="sy0">=</span><span class="st_h">&#8216;(&amp;amp;&#8217;</span><span class="sy0">.</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPSearchFilter&#8217;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">&#8216;(&#8216;</span><span class="sy0">.</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPUidAttribute&#8217;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">&#8216;=&#8217;</span><span class="sy0">.</span><span class="re0">$username</span><span class="sy0">.</span><span class="st_h">&#8216;))&#8217;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Open LDAP connection</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="re0">$ds</span><span class="sy0">=</span><a href="http://www.php.net/ldap_connect"><span class="kw3">ldap_connect</span></a><span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPServer&#8217;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPPort&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/ldap_set_option"><span class="kw3">ldap_set_option</span></a><span class="br0">&#40;</span><span class="re0">$ds</span><span class="sy0">,</span> LDAP_OPT_PROTOCOL_VERSION<span class="sy0">,</span> 3<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Bind as the privilegied user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="re0">$r</span><span class="sy0">=</span><a href="http://www.php.net/ldap_bind"><span class="kw3">ldap_bind</span></a><span class="br0">&#40;</span><span class="re0">$ds</span><span class="sy0">,</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBindDN&#8217;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBindPassword&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// search for the user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="re0">$r</span><span class="sy0">=</span><a href="http://www.php.net/ldap_search"><span class="kw3">ldap_search</span></a><span class="br0">&#40;</span> <span class="re0">$ds</span><span class="sy0">,</span> <span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBaseDN&#8217;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$ldap_filter</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;uid&quot;</span><span class="sy0">,</span><span class="st0">&quot;cn&quot;</span><span class="sy0">,</span><span class="st0">&quot;localentryid&quot;</span><span class="sy0">,</span><span class="st0">&quot;userpassword&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">DieWithFriendlyErrorMsg<span class="br0">&#40;</span> <span class="st0">&quot;Debug Error: Could not login user &#8216;&quot;</span> <span class="sy0">.</span> <span class="re0">$username</span> <span class="sy0">.</span> <span class="st0">&quot;&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;strong&gt;Sessionarray&lt;/strong&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;pre&gt;&quot;</span> <span class="sy0">.</span> <a href="http://www.php.net/var_export"><span class="kw3">var_export</span></a><span class="br0">&#40;</span><span class="re0">$_SESSION</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;&lt;/pre&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;strong&gt;Search Filter &lt;/strong&gt;: &quot;</span> <span class="sy0">.</span> <span class="re0">$ldap_filter</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$info</span> <span class="sy0">=</span> <a href="http://www.php.net/ldap_get_entries"><span class="kw3">ldap_get_entries</span></a><span class="br0">&#40;</span><span class="re0">$ds</span><span class="sy0">,</span> <span class="re0">$r</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$info</span> <span class="sy0">||</span> <span class="re0">$info</span><span class="br0">&#91;</span><span class="st0">&quot;count&quot;</span><span class="br0">&#93;</span> <span class="sy0">!=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">DieWithFriendlyErrorMsg<span class="br0">&#40;</span> <span class="st0">&quot;Debug Error: Could not login user &#8216;&quot;</span> <span class="sy0">.</span> <span class="re0">$username</span> <span class="sy0">.</span> <span class="st0">&quot;&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;strong&gt;Sessionarray&lt;/strong&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;pre&gt;&quot;</span> <span class="sy0">.</span> <a href="http://www.php.net/var_export"><span class="kw3">var_export</span></a><span class="br0">&#40;</span><span class="re0">$_SESSION</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;&lt;/pre&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&lt;strong&gt;Search Filter &lt;/strong&gt;: &quot;</span> <span class="sy0">.</span> <span class="re0">$ldap_filter</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// now we have the user data. Do a bind to check for his password</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="re0">$r</span><span class="sy0">=</span><a href="http://www.php.net/ldap_bind"><span class="kw3">ldap_bind</span></a><span class="br0">&#40;</span> <span class="re0">$ds</span><span class="sy0">,</span> <span class="re0">$info</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">&#8216;dn&#8217;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re0">$password</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// for the moment when a user logs in from LDAP, create it in the DB.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// then the prefs and group management is done in the DB and we don&#8217;t rewrite the whole Loganalyzer code&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// check if the user already exist</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$sqlquery</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT * FROM &quot;</span> <span class="sy0">.</span> DB_USERS <span class="sy0">.</span> <span class="st0">&quot; WHERE username = &#8216;&quot;</span> <span class="sy0">.</span> <span class="re0">$username</span> <span class="sy0">.</span> <span class="st0">&quot;&#8217;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$result</span> <span class="sy0">=</span> DB_Query<span class="br0">&#40;</span><span class="re0">$sqlquery</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span> <span class="sy0">=</span> DB_GetSingleRow<span class="br0">&#40;</span><span class="re0">$result</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_admin&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Create User</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$result</span> <span class="sy0">=</span> DB_Query<span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO &quot;</span> <span class="sy0">.</span> DB_USERS <span class="sy0">.</span> <span class="st0">&quot; (id, username, password, is_admin, is_readonly) VALUES (&quot;</span><span class="sy0">.</span><span class="re0">$info</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">&#8216;localentryid&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;, &#8216;<span class="es4">$username</span>&#8216;, &#8216;rnd&quot;</span><span class="sy0">.</span><a href="http://www.php.net/md5"><span class="kw3">md5</span></a><span class="br0">&#40;</span><a href="http://www.php.net/mt_rand"><span class="kw3">mt_rand</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;rnd&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;&#8217;, 0, 1)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">DB_FreeQuery<span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_admin&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;last_login&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_readonly&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;username&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$info</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$content</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPUidAttribute&#8217;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;password&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;hidden&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;dn&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$info</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">&#8216;dn&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;ID&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$info</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">&#8216;localentryid&#8217;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_admin&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_admin&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_readonly&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;is_readonly&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrowfinal</span><span class="br0">&#91;</span><span class="st_h">&#8216;last_login&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$myrow</span><span class="br0">&#91;</span><span class="st_h">&#8216;last_login&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="re0">$myrowfinal</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Default return false</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> CheckUserLogin<span class="br0">&#40;</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">global</span> <span class="re0">$content</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// if auth LDAP is used, don&#8217;t check the DB yet</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> GetConfigSetting<span class="br0">&#40;</span><span class="st0">&quot;LDAPUserLoginRequired&quot;</span><span class="sy0">,</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="st0">&quot;true&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span> <span class="sy0">=</span> CheckLDAPUserLogin<span class="br0">&#40;</span> <span class="re0">$username</span><span class="sy0">,</span> <span class="re0">$password</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// TODO: SessionTime and AccessLevel check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$md5pass</span> <span class="sy0">=</span> <a href="http://www.php.net/md5"><span class="kw3">md5</span></a><span class="br0">&#40;</span><span class="re0">$password</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$sqlquery</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT * FROM &quot;</span> <span class="sy0">.</span> DB_USERS <span class="sy0">.</span> <span class="st0">&quot; WHERE username = &#8216;&quot;</span> <span class="sy0">.</span> <span class="re0">$username</span> <span class="sy0">.</span> <span class="st0">&quot;&#8217; and password = &#8216;&quot;</span> <span class="sy0">.</span> <span class="re0">$md5pass</span> <span class="sy0">.</span> <span class="st0">&quot;&#8217;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$result</span> <span class="sy0">=</span> DB_Query<span class="br0">&#40;</span><span class="re0">$sqlquery</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$myrow</span> <span class="sy0">=</span> DB_GetSingleRow<span class="br0">&#40;</span><span class="re0">$result</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>The rest of the code is the same.<br />
Also I had to add some configuration entries in the config.php file</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// &#8212; LDAP auth options</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPUserLoginRequired&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="co1">// activate LDAP auth</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPServer&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;localhost&quot;</span><span class="sy0">;</span> <span class="co1">// LDAP server hostname or IP</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPPort&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">389</span><span class="sy0">;</span> <span class="co1">// LDAP port, 389 or 636 for SSL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBaseDN&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;ou=my,o=ldap&quot;</span><span class="sy0">;</span> <span class="co1">// Base DN for LDAP search</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPSearchFilter&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;(objectclass=inetOrgPerson)&quot;</span><span class="sy0">;</span> <span class="co1">// search filter</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPUidAttribute&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;uid&quot;</span><span class="sy0">;</span> <span class="co1">// the LDAP attribute used in the search to find the user. ex : uid, cn</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBindDN&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;cn=Manager,ou=my,o=ldap&quot;</span><span class="sy0">;</span> <span class="co1">// DN of the privileged user for the search</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPBindPassword&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">&#8216;secret&#8217;</span><span class="sy0">;</span> <span class="co1">// Password of the privilegied user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$CFG</span><span class="br0">&#91;</span><span class="st_h">&#8216;LDAPGroupAttribute&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">&#8216;member&#8217;</span><span class="sy0">;</span> <span class="co1">// attribute used to search for groups</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// &#8212;</span></div>
</li>
</ol>
</div>
</div>
<p>Here is the diff that you can put in a file and use the &laquo;&nbsp;patch&nbsp;&raquo; command to install.</p>
<div class="codesnip-container" >
<div class="diff codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">&#8212; include/functions_users_orig.php 2012-01-19 14:36:24.000000000 -0500</div>
</li>
<li class="li1">
<div class="de1"><span class="re4">+++ include/functions_users.php <span class="nu0">2012</span>-01-<span class="nu0">19</span> <span class="nu0">14</span>:<span class="nu0">33</span>:<span class="nu0">12.000000000</span> -0500</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">16</span> +<span class="nu0">157</span>,<span class="nu0">83</span> @@</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re7">-function CheckUserLogin<span class="br0">&#40;</span> $username, $password <span class="br0">&#41;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+function CheckLDAPUserLogin<span class="br0">&#40;</span> $username, $password <span class="br0">&#41;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">global $content;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re7">- // TODO: SessionTime and AccessLevel check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $ldap_filter=&#8217;<span class="br0">&#40;</span>&amp;amp;&#8217;.$content<span class="br0">&#91;</span>&#8216;LDAPSearchFilter&#8217;<span class="br0">&#93;</span>.&#8217;<span class="br0">&#40;</span>&#8216;.$content<span class="br0">&#91;</span>&#8216;LDAPUidAttribute&#8217;<span class="br0">&#93;</span>.&#8217;=&#8217;.$username.&#8217;<span class="br0">&#41;</span><span class="br0">&#41;</span>&#8216;;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re7">- $md5pass = md5<span class="br0">&#40;</span>$password<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re7">- $sqlquery = &quot;SELECT * FROM &quot; . DB_USERS . &quot; WHERE username = &#8216;&quot; . $username . &quot;&#8217; and password = &#8216;&quot; . $md5pass . &quot;&#8217;&quot;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re7">- $result = DB_Query<span class="br0">&#40;</span>$sqlquery<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re7">- $myrow = DB_GetSingleRow<span class="br0">&#40;</span>$result, true<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // Open LDAP connection</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!<span class="br0">&#40;</span>$ds=ldap_connect<span class="br0">&#40;</span>$content<span class="br0">&#91;</span>&#8216;LDAPServer&#8217;<span class="br0">&#93;</span>,$content<span class="br0">&#91;</span>&#8216;LDAPPort&#8217;<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ ldap_set_option<span class="br0">&#40;</span>$ds, LDAP_OPT_PROTOCOL_VERSION, 3<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // Bind as the privilegied user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!<span class="br0">&#40;</span>$r=ldap_bind<span class="br0">&#40;</span>$ds,$content<span class="br0">&#91;</span>&#8216;LDAPBindDN&#8217;<span class="br0">&#93;</span>,$content<span class="br0">&#91;</span>&#8216;LDAPBindPassword&#8217;<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // search for the user</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!<span class="br0">&#40;</span>$r=ldap_search<span class="br0">&#40;</span> $ds, $content<span class="br0">&#91;</span>&#8216;LDAPBaseDN&#8217;<span class="br0">&#93;</span>, $ldap_filter, array<span class="br0">&#40;</span>&quot;uid&quot;,&quot;cn&quot;,&quot;localentryid&quot;,&quot;userpassword&quot;<span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ DieWithFriendlyErrorMsg<span class="br0">&#40;</span> &quot;Debug Error: Could not login user &#8216;&quot; . $username . &quot;&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;strong&gt;Sessionarray&lt;/strong&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;pre&gt;&quot; . var_export<span class="br0">&#40;</span>$_SESSION, true<span class="br0">&#41;</span> . &quot;&lt;/pre&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;strong&gt;Search Filter &lt;/strong&gt;: &quot; . $ldap_filter <span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $info = ldap_get_entries<span class="br0">&#40;</span>$ds, $r<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!$info || $info<span class="br0">&#91;</span>&quot;count&quot;<span class="br0">&#93;</span> != <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ DieWithFriendlyErrorMsg<span class="br0">&#40;</span> &quot;Debug Error: Could not login user &#8216;&quot; . $username . &quot;&#8217;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;strong&gt;Sessionarray&lt;/strong&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;pre&gt;&quot; . var_export<span class="br0">&#40;</span>$_SESSION, true<span class="br0">&#41;</span> . &quot;&lt;/pre&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">&lt;strong&gt;Search Filter &lt;/strong&gt;: &quot; . $ldap_filter <span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // now we have the user data. Do a bind to check for his password</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!<span class="br0">&#40;</span>$r=ldap_bind<span class="br0">&#40;</span> $ds, $info<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span>&#8216;dn&#8217;<span class="br0">&#93;</span>,$password<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // for the moment when a user logs in from LDAP, create it in the DB.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // then the prefs and group management is done in the DB and we don&#8217;t rewrite the whole Loganalyzer code&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // check if the user already exist</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $sqlquery = &quot;SELECT * FROM &quot; . DB_USERS . &quot; WHERE username = &#8216;&quot; . $username . &quot;&#8217;&quot;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $result = DB_Query<span class="br0">&#40;</span>$sqlquery<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow = DB_GetSingleRow<span class="br0">&#40;</span>$result, true<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span>!isset<span class="br0">&#40;</span>$myrow<span class="br0">&#91;</span>&#8216;is_admin&#8217;<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // Create User</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $result = DB_Query<span class="br0">&#40;</span>&quot;INSERT INTO &quot; . DB_USERS . &quot; <span class="br0">&#40;</span>id, username, password, is_admin, is_readonly<span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span>&quot;.$info<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>&#8216;localentryid&#8217;<span class="br0">&#93;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>.&quot;, &#8216;$username&#8217;, &#8216;rnd&quot;.md5<span class="br0">&#40;</span>mt_rand<span class="br0">&#40;</span><span class="br0">&#41;</span>.&quot;rnd&quot;<span class="br0">&#41;</span>.&quot;&#8217;, 0, 1<span class="br0">&#41;</span>&quot;<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ DB_FreeQuery<span class="br0">&#40;</span>$result<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow<span class="br0">&#91;</span>&#8216;is_admin&#8217;<span class="br0">&#93;</span> = <span class="nu0">0</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow<span class="br0">&#91;</span>&#8216;last_login&#8217;<span class="br0">&#93;</span> = <span class="nu0">0</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow<span class="br0">&#91;</span>&#8216;is_readonly&#8217;<span class="br0">&#93;</span> = <span class="nu0">1</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;username&#8217;<span class="br0">&#93;</span> = $info<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>$content<span class="br0">&#91;</span>&#8216;LDAPUidAttribute&#8217;<span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;password&#8217;<span class="br0">&#93;</span> = &quot;hidden&quot;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;dn&#8217;<span class="br0">&#93;</span> = $info<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>&#8216;dn&#8217;<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;ID&#8217;<span class="br0">&#93;</span> = $info<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>&#8216;localentryid&#8217;<span class="br0">&#93;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;is_admin&#8217;<span class="br0">&#93;</span> = $myrow<span class="br0">&#91;</span>&#8216;is_admin&#8217;<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;is_readonly&#8217;<span class="br0">&#93;</span> = $myrow<span class="br0">&#91;</span>&#8216;is_readonly&#8217;<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrowfinal<span class="br0">&#91;</span>&#8216;last_login&#8217;<span class="br0">&#93;</span> = $myrow<span class="br0">&#91;</span>&#8216;last_login&#8217;<span class="br0">&#93;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return $myrowfinal;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // Default return false</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ return false;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+<span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+function CheckUserLogin<span class="br0">&#40;</span> $username, $password <span class="br0">&#41;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+<span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ global $content;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // if auth LDAP is used, don&#8217;t check the DB yet</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ if <span class="br0">&#40;</span> GetConfigSetting<span class="br0">&#40;</span>&quot;LDAPUserLoginRequired&quot;, &quot;&quot;<span class="br0">&#41;</span> == &quot;true&quot;<span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow = CheckLDAPUserLogin<span class="br0">&#40;</span> $username, $password <span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ else <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ // TODO: SessionTime and AccessLevel check</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $md5pass = md5<span class="br0">&#40;</span>$password<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $sqlquery = &quot;SELECT * FROM &quot; . DB_USERS . &quot; WHERE username = &#8216;&quot; . $username . &quot;&#8217; and password = &#8216;&quot; . $md5pass . &quot;&#8217;&quot;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $result = DB_Query<span class="br0">&#40;</span>$sqlquery<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ $myrow = DB_GetSingleRow<span class="br0">&#40;</span>$result, true<span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re8">+ <span class="br0">&#125;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">// The admin field must be set!</div>
</li>
<li class="li1">
<div class="de1">if <span class="br0">&#40;</span> isset<span class="br0">&#40;</span>$myrow<span class="br0">&#91;</span>&#8216;is_admin&#8217;<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span></div>
</li>
</ol>
</div>
</div>
<p>For the SQL of the logs tables :</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`logs`</span> <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`host`</span> varchar<span class="br0">&#40;</span>128<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`facility`</span> varchar<span class="br0">&#40;</span>10<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`priority`</span> varchar<span class="br0">&#40;</span>10<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`level`</span> varchar<span class="br0">&#40;</span>10<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`tag`</span> varchar<span class="br0">&#40;</span>10<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`datetime`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`program`</span> varchar<span class="br0">&#40;</span>256<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`msg`</span> text collate utf8_unicode_ci<span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`seq`</span> bigint<span class="br0">&#40;</span>20<span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`counter`</span> int<span class="br0">&#40;</span>11<span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#8217;1&#8242;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`fo`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`lo`</span> datetime <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`processid`</span> char<span class="br0">&#40;</span>8<span class="br0">&#41;</span> collate utf8_unicode_ci <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span><span class="st0">`seq`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`datetime`</span> <span class="br0">&#40;</span><span class="st0">`datetime`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`priority`</span> <span class="br0">&#40;</span><span class="st0">`priority`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`facility`</span> <span class="br0">&#40;</span><span class="st0">`facility`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`program`</span> <span class="br0">&#40;</span><span class="st0">`program`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`host`</span> <span class="br0">&#40;</span><span class="st0">`host`</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`host_datetime`</span> <span class="br0">&#40;</span><span class="st0">`host`</span><span class="sy0">,</span><span class="st0">`datetime`</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE<span class="sy0">=</span>MyISAM <span class="kw1">AUTO_INCREMENT</span><span class="sy0">=</span>1339013 <span class="kw1">DEFAULT</span> CHARSET<span class="sy0">=</span>utf8 COLLATE<span class="sy0">=</span>utf8_unicode_ci;</div>
</li>
</ol>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/1328/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monitoring PHP APC cache usage</title>
		<link>http://www.lecentre.net/blog/archives/1311</link>
		<comments>http://www.lecentre.net/blog/archives/1311#comments</comments>
		<pubDate>Mon, 03 Oct 2011 19:22:08 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=1311</guid>
		<description><![CDATA[APC is one of PHP Opcode Cache on the &#171;&#160;market&#160;&#187;. It is free and should be bundled inside the next revision of PHP, version 6. I won&#8217;t go deep into how OpCode caches work, you will find a lot of docs, just google for APC, Xcache, eAccelerator&#8230; What I can say is that APC (as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lecentre.net/blog/wp-content/uploads/2011/10/APC-INFO-qxat3p01-10.100.34.39-Mozilla-Firefox_2011-10-03_14-31-37.jpg"><img class="alignleft size-full wp-image-1312" title="APC INFO (qxat3p01) (10.100.34.39) - Mozilla Firefox_2011-10-03_14-31-37" src="http://www.lecentre.net/blog/wp-content/uploads/2011/10/APC-INFO-qxat3p01-10.100.34.39-Mozilla-Firefox_2011-10-03_14-31-37.jpg" alt="" width="128" height="53" /></a></p>
<p>APC is one of PHP Opcode Cache on the &laquo;&nbsp;market&nbsp;&raquo;. It is free and should be bundled inside the next revision of PHP, version 6.</p>
<p>I won&#8217;t go deep into how OpCode caches work, you will find a lot of docs, just google for APC, Xcache, eAccelerator&#8230; What I can say is that APC (as other caches do) will &laquo;&nbsp;save&nbsp;&raquo; binary parts of your PHP code into memory and use it when you call for the same PHP function again. This way you save all the PHP file opening, parsing, etc.</p>
<p>Maybe you noticed I said &laquo;&nbsp;into memory&nbsp;&raquo;. Yes. When you start APC it take a small amount (64 or 32Mo standard) of memory and store the binary parts in it.<br />
This is fine but what if you have a really big website with lots of functions, classes, includes&#8230; like when you&#8217;re using Typo3 and tons of extensions ?</p>
<p>One thing you won&#8217;t come accross often on internet is &laquo;&nbsp;How (the hell) do I know if APC is performing well ?&nbsp;&raquo;</p>
<p>First, most of the time, the PHP page generation time is halved when you activate APC. This is a good clue. Great.<br />
But what about memory consumption ?</p>
<p>During my tests, I found that APC completly flush the memory if it cannot add a new object. I don&#8217;t know if it&#8217;s a normal behaviour but it&#8217;s what I noted. This is why you have to extensively do your testing and tune the memory size before going to production.</p>
<p>This can be done really easyly with the apc.php page provided in the  APC package. You may not have it if you used some Linux package installer like yum or aptitude. If so, you&#8217;ll have to download the APC source from their website and copy apc.php to your web DocumentRoot or wherever you want it. As this is giving sensible informations, I would recomment to put it in a secured place.<br />
We are using Typo3 here so I put the page in the /typo3 folder, which is protected and only accessible by the backend users. This is secure enough for now. Else, use the default login process, user &laquo;&nbsp;apc&nbsp;&raquo; and password &laquo;&nbsp;password&nbsp;&raquo;. This can be changed in the page. Disable it if you put the file inside an already protected location.</p>
<p>Browse to your apc.php page and see what happen. First, you&#8217;ll get a nasty PHP error if you don&#8217;t have APC PHP module enabled. Ensure it is enables in /etc/php.d/apc.conf (on CentOS, can be somewhere else on other distro).</p>
<p><a href="http://www.lecentre.net/blog/wp-content/uploads/2011/10/APC-INFO3.jpg"><img class="aligncenter size-large wp-image-1326" title="APC-INFO3" src="http://www.lecentre.net/blog/wp-content/uploads/2011/10/APC-INFO3-1024x696.jpg" alt="" width="1024" height="696" /></a></p>
<p>What you see here is, on the left, some metrics and informations of the versions, uptime&#8230;<br />
On the right you have the memory utilisation and the cache hit/miss representation. Also, you can see the fragmentation of the memory. You don&#8217;t want that but actualy I&#8217;m not sure you have a way to reduce it&#8230;</p>
<p>The things you need to check are on the left side, in the panel &laquo;&nbsp;File Cache Information&nbsp;&raquo;.<br />
<a href="http://www.lecentre.net/blog/wp-content/uploads/2011/11/APC-INFO.jpg"><img class="aligncenter size-full wp-image-1321" title="APC-INFO" src="http://www.lecentre.net/blog/wp-content/uploads/2011/11/APC-INFO.jpg" alt="" width="456" height="220" /></a></p>
<p>Hits : how many objects were already in the cache and were used</p>
<p>Miss : how many objects were NOT in the cache, for whatever reason : first request for it, memory full, object can&#8217;t be cached&#8230;</p>
<p>Cache Full Count : how many times the cache (memory) was full and flushed</p>
<p>This last one is one of the most important and need to be checked first when you website start to slow.</p>
<p>Monitoring</p>
<p>Now you want to monitor this with your Nagios/Centreon or whatever&#8230; Well.<br />
I found a &laquo;&nbsp;APC monitoring project&nbsp;&raquo; out there, <a href="https://github.com/wwalter/apc-php-monitor" target="_blank">APC-PHP-MONITOR on GitHub</a>. This was my starting point as this one is really basic.</p>
<p>As they do, I made a PHP script you have to put in your PHP website somewhere. I used a basic check to ensure only the right IP can access this script. In my case, 10.1.1.88.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;!&#8211;</span>?php <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;REMOTE_ADDR&quot;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st0">&quot;10.1.1.88&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">print</span><span class="br0">&#40;</span><a href="http://www.php.net/serialize"><span class="kw3">serialize</span></a><span class="br0">&#40;</span>apc_cache_info<span class="br0">&#40;</span><span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> ?<span class="sy0">&#8211;&gt;</span></div>
</li>
</ol>
</div>
</div>
<p>Then I modified the PHP script so I can use it from Nagios or whatever. I named the file check_php_apc_cache.php. It&#8217;s not a superbe PHP script. It&#8217;s just dirty working fine for now.</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;!&#8211;</span>?php <span class="sy0">&lt;</span>br ?<span class="sy0">&#8211;&gt;</span> <span class="co2"># check_php_apc_cache.php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Modification by Sebastien Prune THOMAS</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># v1 &#8211; 20111003</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># creation</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">####################################</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$options</span> <span class="sy0">=</span> <a href="http://www.php.net/getopt"><span class="kw3">getopt</span></a><span class="br0">&#40;</span><span class="st0">&quot;H:p:w:c:d::&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># variables</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$output</span> <span class="sy0">=</span> <span class="st0">&quot;OK&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$port</span><span class="sy0">=</span><span class="nu0">80</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$warning</span><span class="sy0">=</span><span class="nu0">30</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$critical</span><span class="sy0">=</span><span class="nu0">10</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$debug</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># code return : 0=OK, 1=WARN, 2=CRIT, 3=UNKNOWN</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$retcode</span><span class="sy0">=</span><span class="nu0">3</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$argv</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span>lt<span class="sy0">;</span> 2 or <span class="re0">$argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">==</span><span class="st0">&quot;help&quot;</span> <span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;usage: php apc_stats.php -H hostname -p [port] -w [warning] -c [critical] [-d]<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot; hostname will be changed in a URL like http://hostname:port/apc_mon.php<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot; port is the HTTP port to use, default to 80<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot; warning : low level of cache use that will raise a warning. default 30<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot; critical : low level of cache use that will raise a critical. default 10<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot; -d enables debug mode<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;H&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> and <span class="sy0">!</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;H&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$host</span> <span class="sy0">=</span> <span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;H&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;p&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> and <span class="sy0">!</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;p&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$port</span> <span class="sy0">=</span> <span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;p&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;w&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> and <span class="sy0">!</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;w&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$warning</span> <span class="sy0">=</span> <span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;w&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;c&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> and <span class="sy0">!</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;c&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st0">&quot;d&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$debug</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="co2">#ensure critical is lower than warning if ($critical &amp;gt;= $warning) {</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&quot;Error : critical value must be lower than warning<span class="es1">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># get the answer from the php APC page</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$url</span> <span class="sy0">=</span> <span class="st0">&quot;http://&quot;</span> <span class="sy0">.</span> <span class="re0">$host</span> <span class="sy0">.</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">.</span> <span class="re0">$port</span> <span class="sy0">.</span> <span class="st0">&quot;/apc_mon.php&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$results</span> <span class="sy0">=</span> <a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> or <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;server is not responding&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span> <span class="re0">$results</span> <span class="sy0">=</span> <a href="http://www.php.net/unserialize"><span class="kw3">unserialize</span></a><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;ERROR/n&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># debug</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$debug</span> <span class="sy0">==</span> 1<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># compute ratio</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&quot;num_hits&quot;</span><span class="br0">&#93;</span> <span class="sy0">&amp;</span>gt<span class="sy0">;</span> 0<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$hit_ratio</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&quot;num_hits&quot;</span><span class="br0">&#93;</span><span class="sy0">/</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&quot;num_hits&quot;</span><span class="br0">&#93;</span><span class="sy0">+</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&quot;num_misses&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">*</span><span class="nu0">100</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$hit_ratio</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$hit_ratio</span> <span class="sy0">&amp;</span>gt<span class="sy0">;=</span> <span class="re0">$warning</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$output</span> <span class="sy0">=</span> <span class="st0">&quot;OK&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$retcode</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$critical</span></div>
</li>
</ol>
</div>
</div>
<p>You can then create a Nagios check or Template. Mine looks like this :</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">define <span class="kw3">command</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">command_name check_PHP_APC_cache</div>
</li>
<li class="li1">
<div class="de1">command_line php <span class="re1">$USER1</span>$<span class="sy0">/</span>check_php_apc_cache.php <span class="re5">-H</span> <span class="re1">$HOSTADDRESS</span>$ <span class="re5">-p</span> <span class="re1">$ARG1</span>$ <span class="re5">-w</span> <span class="re1">$ARG2</span>$ <span class="re5">-c</span> <span class="re1">$ARG3</span>$</div>
</li>
<li class="li1">
<div class="de1">;<span class="re1">$ARG1</span>$ TCP port <span class="br0">&#40;</span>80<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">;<span class="re1">$ARG2</span>$ warning level <span class="br0">&#40;</span>30<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">;<span class="re1">$ARG3</span>$ critical level <span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>Finaly, the result :<br />
<a href="http://www.lecentre.net/blog/wp-content/uploads/2011/10/Centreon-IT-Network-Monitoring-Mozilla-Firefox_2011-10-03_15-04-13.jpg"><img class="alignnone size-large wp-image-1316" title="Centreon - IT &amp; Network Monitoring - Mozilla Firefox_2011-10-03_15-04-13" src="http://www.lecentre.net/blog/wp-content/uploads/2011/10/Centreon-IT-Network-Monitoring-Mozilla-Firefox_2011-10-03_15-04-13-1024x83.jpg" alt="" width="1024" height="83" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/1311/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle 11g R2 on Linux Fedora</title>
		<link>http://www.lecentre.net/blog/archives/842</link>
		<comments>http://www.lecentre.net/blog/archives/842#comments</comments>
		<pubDate>Fri, 18 Sep 2009 14:21:48 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=842</guid>
		<description><![CDATA[This is my first attempt at Oracle 11g with Linux. As I&#8217;m still waiting for the 11G R2 to be released on Solaris, I managed to have a try on a Linux VM. First, get VirtualBox Then, get a Fedora 11 image You may also need a &#171;&#160;z7&#8243; compressor to un-z7 the image. You can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lecentre.net/blog/wp-content/uploads/2009/09/otn_logo_small.gif" alt="otn_logo_small" title="otn_logo_small" width="148" height="59" class="alignleft size-full wp-image-848" /><br />
This is my first attempt at Oracle 11g with Linux. As I&#8217;m still waiting for the 11G R2 to be released on Solaris, I managed to have a try on a Linux VM.</p>
<p>First, get <a href="http://www.virtualbox.org/">VirtualBox</a><br />
Then, get a <a href="http://virtualbox.wordpress.com/images/fedora/">Fedora 11 image</a><br />
You may also need a &laquo;&nbsp;z7&#8243; compressor to un-z7 the image. You can get 7za from the Macports </p>
<div class="codesnip-container" ># port install p7zip<br />
# 7za  e fedora-11-x86.7z</p>
<p>7-Zip (A) 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30<br />
p7zip Version 9.04 (locale=utf8,Utf16=on,HugeFiles=on,2 CPUs)</p>
<p>Processing archive: fedora-11-x86.7z</p>
<p>Extracting  Machine/fedora-11-x86/fedora-11-x86.xml<br />
Extracting  VDI/fedora-11-x86.vdi<br />
Extracting  VDI<br />
Extracting  Machine/fedora-11-x86<br />
Extracting  Machine</p>
<p>Everything is Ok</p>
<p>Folders: 3<br />
Files: 2<br />
Size:       4740698220<br />
Compressed: 1148257214</p></div>
<p>Then configure and start the VM. I had to add 3 NICs, so I have 4 network interfaces, enough to play. I also set the first one as Bridge instead of the default NAT, so my VM have a real IP.<br />
I then have to log as root, chance the /etc/sudoers so Wheel users can sudo. Then I added fedora (default user) to Wheel group in /etc/groups.<br />
Now I can sudo. We are close to be able to install Oracle database. While I&#8217;m at it, go to<a href="http://www.oracle.com/technology/software/products/database/index.html"> Oracle website</a> and download the 2 install zip files. This is quite huge, around 2.1Gb. Be carefull when you unzip (not yet), as everything lives in the &laquo;&nbsp;database&nbsp;&raquo; folder&#8230;<br />
You will also need the <a href="http://download.oracle.com/otn/linux/oracle11g/R2/linux_11gR2_grid.zip">Grid Infrastructure Software</a>.<br />
Please note we are installong the 32bits versions, but the 64bits version is the same, only <a href="http://www.oracle.com/technology/software/products/database/index.html">the packages to download</a> are different. Click on the &laquo;&nbsp;view all&nbsp;&raquo; to get the Grid Infrastructure Software.</p>
<p>For Oracle 11G R2 to work on linux you need to fulfill some dependencies, starting with some RPM packages. Use &#8216;yum&#8217; to search for them and install them. Here is a list according to <a href="http://download.oracle.com/docs/cd/E11882_01/install.112/e10812/prelinux.htm#BABFDJJF">Oracle Linux recommendations</a> :</p>
<div class="codesnip-container" >binutils-2.17.50.0.6<br />
compat-libstdc++-33-3.2.3<br />
compat-libstdc++-33-3.2.3 (32 bit)<br />
elfutils-libelf-0.125<br />
elfutils-libelf-devel-0.125<br />
gcc-4.1.2<br />
gcc-c++-4.1.2<br />
glibc-2.5-24<br />
glibc-2.5-24 (32 bit)<br />
glibc-common-2.5<br />
glibc-devel-2.5<br />
glibc-devel-2.5 (32 bit)<br />
glibc-headers-2.5<br />
ksh-20060214<br />
libaio-0.3.106<br />
libaio-0.3.106 (32 bit)<br />
libaio-devel-0.3.106<br />
libaio-devel-0.3.106 (32 bit)<br />
libgcc-4.1.2<br />
libgcc-4.1.2 (32 bit)<br />
libstdc++-4.1.2<br />
libstdc++-4.1.2 (32 bit)<br />
libstdc++-devel 4.1.2<br />
make-3.81<br />
sysstat-7.0.2<br />
unixODBC-2.2.11<br />
unixODBC-2.2.11 (32 bit)<br />
unixODBC-devel-2.2.11<br />
unixODBC-devel-2.2.11 (32 bit)</div>
<p>11G R2 now comes with a &laquo;&nbsp;bundeled NTP server&nbsp;&raquo;, I mean, Oracle now can sync the time of every node in the cluster. No need of NTPD, and no evictions due to bad Solaris xntpd server. Just disable ntpd or ensure it&#8217;s not running before installing Oracle database.<br />
Also, configure SSHD and kernel parameters, if needed, as <a href="http://download.oracle.com/docs/cd/E11882_01/install.112/e10812/manpreins.htm#BABCHAED">Oracle prerequisite</a>.<br />
Now, let&#8217;s go with Oracle. Create an oracle user with :</p>
<div class="codesnip-container" >adduser oracle<br />
passwd oracle (give a password)</div>
<p>As root, create a /opt/oracle folder and give RWX rights to oracle user.<br />
Create a SSL key for user Oracle, add your personal public key to authorized_keys and log as oracle user. Copy the Oracle install files to the home dir of this user.</p>
<div class="codesnip-container" >mkdir /opt/oracle<br />
chown oracle /opt/oracle<br />
su &#8211; oracle<br />
ssh-keygen -f dsa<br />
(set empty password and write the key in .ssh folder)<br />
vi .ssh/authorized_keys<br />
(copy the pubkey of your admin user)<br />
unzip linux.x64_11gR2_grid.zip<br />
unzip linux_11gR2_database_1of2.zip<br />
unzip linux_11gR2_database_2of2.zip<br />
cd database</div>
<p>Log-in again with your oracle user, setting X11 forwarding (use -X -Y if you are using a mac) : </p>
<div class="codesnip-container" >ssh -X -Y oracle@your_host<br />
cd grid</p>
<p>cd database<br />
./runInstaller</p>
<p>Starting Oracle Universal Installer&#8230;</p>
<p>Checking Temp space: must be greater than 80 MB.   Actual 9828 MB    Passed<br />
Checking swap space: must be greater than 150 MB.   Actual 1023 MB    Passed<br />
Checking monitor: must be configured to display at least 256 colors.    Actual 16777216    Passed<br />
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2009-09-18_09-47-50AM. Please wait &#8230;[oracle@localhost database]$ Xlib:  extension &laquo;&nbsp;Generic Event Extension&nbsp;&raquo; missing on display &laquo;&nbsp;localhost:10.0&#8243;.</p></div>
<p>Don&#8217;t take account for X11 errors, as long as you have the install window.<br />
First question is giving out your email address for security updates&#8230; As you ARE a good DBA/Sysadmin, you won&#8217;t need this. Click next <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>As I don&#8217;t have time and I KNOW I will not do better, check there for some more informations on <a href="http://dbastreet.com/docs/11gR2RacInstall_gridinfra.html">installing Oracle 11G R2 RAC ASM</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/842/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Add mssql module to Ubuntu 7.10 PHP</title>
		<link>http://www.lecentre.net/blog/archives/144</link>
		<comments>http://www.lecentre.net/blog/archives/144#comments</comments>
		<pubDate>Mon, 17 Dec 2007 16:44:48 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/144</guid>
		<description><![CDATA[Believe it or not, but latest Ubuntu release 1) does not include the latest PHP yet and 2) does not include mssql module. Reading the newsgroups and forums, it seems nobody have a real tutorial on how to add it. You will also notice that Ubuntu builders have no plan to include it one day&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Believe it or not, but latest Ubuntu release 1) does not include the latest PHP yet and 2) does not include mssql module.</p>
<p>Reading the newsgroups and forums, it seems nobody have a real tutorial on how to add it. You will also notice that Ubuntu builders have no plan to include it one day&#8230; (even if it is free, not under specific licence and need almost no dependency (Freetds is needed but I don&#8217;t know if it is mandatory to build).</p>
<p>Whatever, I need this module, and I came with a working solution :</p>
<pre lang="Bash">
apt-get source php5
cd /usr/lib/php5/php5-5.2.3/ext/mssql
phpize
./configure
make
make install
</pre>
<p>Just create a ini file in  /etc/php5/conf.d/mssql.ini with :</p>
<pre lang="PHP">
# configuration for php MsSQL
moduleextension=mssql.so</pre>
<p>And restart you Apache server.</p>
<p>!! Be warned that the module may be removed at the next package upgrade !! You will have to compile it again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/144/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2 un Ubuntu 7.10</title>
		<link>http://www.lecentre.net/blog/archives/139</link>
		<comments>http://www.lecentre.net/blog/archives/139#comments</comments>
		<pubDate>Sun, 09 Dec 2007 16:40:04 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/139</guid>
		<description><![CDATA[As usual in any new linux distro, Apache is not installed the same way as the previous. on ubuntu, you&#8217;ll find a bunch of files and directory in /etc/apache2. I ended searching on &#171;&#160;how can I add the LDAP authentication module, authzn_ldap. This module is in the mods-available directory. One solution seems to link it [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ubuntu.com" target="_blank"><img src="http://www.lecentre.net/blog/wp-content/uploads/2007/12/ubuntulogo.png" alt="logo ubuntu" /></a> <a href="http://www.apache.org" target="_blank"><img src="http://www.lecentre.net/blog/wp-content/uploads/2007/12/asf_logo_wide.gif" alt="Apache logo" /></a></p>
<p>As usual in any new linux distro, <a href="http://www.apache.org" target="_blank">Apache</a> is not installed the same way as the previous. on ubuntu, you&#8217;ll find a bunch of files and directory in /etc/apache2.<br />
I ended searching on &laquo;&nbsp;how can I add the LDAP authentication module, authzn_ldap. This module is in the mods-available directory.</p>
<p>One solution seems to link it to mods-enabled directory.<br />
Or you can use the (new to me) utility &#8216;a2enmod&#8217;, which stand for Apache2 Enable Module. you also have a2dismod to remove a module or a2dissite to remove a site (if your site conf is in the /etc/apache2/site-available directory.</p>
<p>I haven&#8217;t been waiting for Ubuntu to offer that as I&#8217;m doing such a thing for almost 8 years now. Moreover, and this is something I would like to release one day, all my apache vhost conf is stored in Ldap, and managed through a set of PHP pages. I just have to change the conf from the web interface and clic &laquo;&nbsp;dump conf&nbsp;&raquo;, and every modified entry is dumped to the right file, and the link is made or removed automaticaly if needed.<br />
Wait for it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/139/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lack on naming convention in Jack</title>
		<link>http://www.lecentre.net/blog/archives/116</link>
		<comments>http://www.lecentre.net/blog/archives/116#comments</comments>
		<pubDate>Mon, 24 Sep 2007 08:25:47 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/116</guid>
		<description><![CDATA[I&#8217;m really supprised today to see how applications uses Jack (the Linux &#8211; and other now &#8211; audio patch). The Jack plus name is made of two parts : the application name and the &#171;&#160;channel&#160;&#187; name. The application name must be unique globaly, and the channel must be unique in each application. While some seems [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m really supprised today to see how applications uses Jack (the Linux &#8211; and other now &#8211; audio patch).</p>
<p>The Jack plus name is made of two parts : the application name and the &laquo;&nbsp;channel&nbsp;&raquo; name. The application name must be unique globaly, and the channel must be unique in each application.<br />
While some seems to be configurable in both parts, some are not :</p>
<p>Darkice, by defaults, create a &laquo;&nbsp;darkice-PID:left&nbsp;&raquo; and  &laquo;&nbsp;darkice-PID:right&nbsp;&raquo;, where PID is the real process ID of Darkice. This ensure 2 darkice will not have the same name. The drowback is that it is very hard to find which darkice is which, moreover if you want to script that.<br />
I made a patch for darkice so you can freely change that.</p>
<p>With Ecasound, a command line sound mixer and processing you can only change the channel name. If you start more Ecasound, you will have another process ecasound_2, then ecasound_3&#8230; which is not really better than the way Darkice is doing it natively.<br />
Another issue is when you kill one Ecasound, they all die ! This is a huge issue I will have to work on quickly, but I&#8217;m pretty sure this is due to a jack naming issue.</p>
<p>Then what should the convention be ?</p>
<p>As the important part is the application name, not the channel name, it seems that this part should be configurable.  Then the channel name could be, by default, either a direction and a number, or a direction and a name :</p>
<p>- ecasound-test1:in_1<br />
-  ecasound-test1:in_2<br />
- ecasound-test1:out_1<br />
- ecasound-test1:ou_2</p>
<p>- ecasound-filter2:in_left<br />
- ecasound-filter2:in_right</p>
<p>Devs, please, think of it ! <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/116/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Find the file mode from the umask ? simple ?</title>
		<link>http://www.lecentre.net/blog/archives/111</link>
		<comments>http://www.lecentre.net/blog/archives/111#comments</comments>
		<pubDate>Thu, 30 Aug 2007 09:40:19 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/111</guid>
		<description><![CDATA[This has always been a mess for sysadmins. Even good onces always get fooled by UNIX file rights and umask calculation. The base is simple : take 777 and substract the umask. If umask is 022, you&#8217;ll get a file permission of 755, which mean rwx-rwx-rwx. Remember that 7 is 0111 in binary, so the [...]]]></description>
			<content:encoded><![CDATA[<p>This has always been a mess for sysadmins. Even good onces always get fooled by UNIX file rights and umask calculation.<br />
The base is simple :<br />
take 777 and substract the umask. If umask is 022, you&#8217;ll get a file permission of 755, which mean rwx-rwx-rwx.<br />
Remember that 7 is 0111 in binary, so the rights are only triggered if a 1 is set.<br />
First number is the &laquo;&nbsp;setUID bit&nbsp;&raquo;, second the read, then the write, and the execute right.</p>
<p>But how to do this in C++ ?<br />
<span id="more-111"></span><br />
I had to change the source code of <a href="http://users.ecs.soton.ac.uk/njh/rotter/">Rotter</a> as the file mode mask was hard coded in the source file rotter.c<br />
Rotter is a little and handy application that connect to Jack Audio and dump some inputs into a file (mp3 or wave depending on your compile settings). It have the ability to generate one file per hour, spread in multiple directories.</p>
<p>The hardcoded mask was 755, which is right for many applications, but not for me. I will have some users, with a different UID than rotter, writing some files within the same per day directory.<br />
I so had to change the hardcoded mask to use the &laquo;&nbsp;umask&nbsp;&raquo; C function instead. Easy. But getting the file mode from the mask wan&#8217;t that easy <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I finaly got something working, and here the result.<br />
This is just the modified function in rotter.c : </p>
<pre lang="cpp">
static int mkdir_p( const char* dir )
{
        int result = 0;

        if (directory_exists( dir )) {
                return 0;
        }

        // added by prune
        // get the umask value (by stting it to 0) then set it back
        mode_t mask = umask (0);
        umask (mask);

        // Compute the right mode
        mode_t DIR_MODE = ((0777) ^ mask);

        if (mkdir(dir, DIR_MODE) < 0) {
                if (errno == ENOENT) {
                        // ENOENT (a parent directory doesn't exist)
                        char* parent = strdup( dir );
                        int i;

                        // Create parent directories recursively
                        for(i=strlen(parent); i>0; i--) {
                                if (parent[i]=='/') {
                                        parent[i]=0;
                                        result = mkdir_p( parent );
                                        break;
                                }
                        }

                        free(parent);

                        // Try again to create the directory
                        if (result==0) {
                                result = mkdir(dir, DIR_MODE);
                        }

                } else {
                        result = -1;
                }
        }

        return result;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/111/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tuto apache/svn/track sur ubuntu</title>
		<link>http://www.lecentre.net/blog/archives/26</link>
		<comments>http://www.lecentre.net/blog/archives/26#comments</comments>
		<pubDate>Thu, 21 Jun 2007 22:28:16 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/26</guid>
		<description><![CDATA[Meme si je n&#8217;utilise pas ubuntu, ca peut tjrs etre utile. Je viens de passer dessus, donc je vous en fais profiter : http://www.prendreuncafe.com/blog/post/2006/09/05/489-installer-et-configurer-apache2-trac-et-subversion-sur-ubuntu]]></description>
			<content:encoded><![CDATA[<p>Meme si je n&#8217;utilise pas ubuntu, ca peut tjrs etre utile. Je viens de passer dessus, donc je vous en fais profiter : <a href="http://www.prendreuncafe.com/blog/post/2006/09/05/489-installer-et-configurer-apache2-trac-et-subversion-sur-ubuntu">http://www.prendreuncafe.com/blog/post/2006/09/05/489-installer-et-configurer-apache2-trac-et-subversion-sur-ubuntu</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/26/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

