<?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; Dev</title>
	<atom:link href="http://www.lecentre.net/blog/archives/category/dev/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>WordPress NextGEN Gallery and GPS data</title>
		<link>http://www.lecentre.net/blog/archives/1201</link>
		<comments>http://www.lecentre.net/blog/archives/1201#comments</comments>
		<pubDate>Tue, 18 Jan 2011 14:23:08 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Photo]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=1201</guid>
		<description><![CDATA[NextGen(eration) Gallery is a WordPress plugin from Alex Rabe. It provides image galleries, albums with great ease of administration. As said by the author, it fills a gap in WordPress gallery systems. It can handle &#171;&#160;display&#160;&#187; templates, which can be added to the plugin Views or simply in your theme. That&#8217;s what I&#8217;m working on [...]]]></description>
			<content:encoded><![CDATA[<p><a title="NextGen Gallery" href="http://alexrabe.de/wordpress-plugins/nextgen-gallery/" target="_blank">NextGen(eration) Gallery</a> is a WordPress plugin from Alex Rabe. It provides image galleries, albums with great ease of administration.<br />
As said by the author, it fills a gap in WordPress gallery systems.</p>
<p>It can handle &laquo;&nbsp;display&nbsp;&raquo; templates, which can be added to the plugin Views or simply in your theme. That&#8217;s what I&#8217;m working on right now for the Photo Theme I&#8217;m using in my <a title="blog.lecentre.net" href="http://blog.lecentre.net" target="_blank">new Photo Blog</a>.<br />
This way you don&#8217;t have to install another plugin and use hooks.</p>
<p>While it&#8217;s working well, it still have some features missing.</p>
<p>One of the missing stuffs is beeing able to display GPS data.<br />
My photo blog have Geo-Tagged pictures. I want to be able to display them along with a google map image so my readers can see where it was taken. I also want to display some of the EXIF informations, like lense type, aperture, shutter speed and so on&#8230;</p>
<p>While some of them (most) are already handeled by the NextGen gallery, some of them are not.<br />
NextGen Gallery is using the exif_read_data function to get the data from the file like :</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span> <span class="sy0">=</span> <span class="sy0">@</span><a href="http://www.php.net/exif_read_data"><span class="kw3">exif_read_data</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">image</span><span class="sy0">-&gt;</span><span class="me1">imagePath</span> <span class="sy0">,</span> 0<span class="sy0">,</span> <span class="kw4">true</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>Then, the RAW exif datas are separated in arrays. When trying to access the EXIF tags (using get_EXIF), only the part of the array under [EXIF] will be used. In fact this is partly false, as the get_EXIF function also dig under IFD0 and WINXP.<br />
As the GPS data from my Nikon D700 are under the [GPS] array, there is no chance that NextGen gallery sees them even if you use the wordpress filter to add some new EXIF tags.</p>
<p>Then you only have one solution : check in the RAW meta-data or&#8230; change NextGen so it can handle them in the EXIF tags stored in the database.</p>
<p>So, my solution is divided in few parts :</p>
<ul>
<li>Hardcode some new EXIF tags</li>
<li>get the GPS data inside get_EXIF</li>
<li>add a function to parse the GPS data and make them readable/usable by Google Map</li>
</ul>
<p>Let&#8217;s do it :</p>
<h3>Hardcode some new EXIF tags</h3>
<p>In the file lib/meta.php, change the get_common_meta function so it look like :</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> get_common_meta<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wpdb</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;aperture&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;credit&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;camera&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;caption&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;created_timestamp&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;copyright&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;focal_length&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;iso&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;shutter_speed&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;flash&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;title&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;altitude&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;longitude&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;latitude&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;timestamp&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;datestamp&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;satellites&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;direction&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;lense&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;keywords&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&nbsp;&raquo;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>As you can see, I add all the GPS data, plus &laquo;&nbsp;lense&nbsp;&raquo;, which is just a hook as the EXIF tag for the lense is actualy &laquo;&nbsp;UndefinedTag:0xA434&#8243;</p>
<p>You can also add the new tags in the i8n translation function</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> i8n_name<span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tagnames</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;aperture&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Aperture&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;credit&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Credit&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;camera&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Camera&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;caption&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Caption&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;created_timestamp&#8217;</span> <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Date/Time&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;copyright&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Copyright&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;focal_length&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Focal length&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;iso&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;ISO&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;shutter_speed&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Shutter speed&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;title&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Title&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;author&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Author&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;tags&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Tags&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;subject&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Subject&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;make&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Make&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;status&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Edit Status&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;category&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Category&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;keywords&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Keywords&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;created_date&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Date Created&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;created_time&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Time Created&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;position&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Author Position&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;city&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;City&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;location&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Location&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;state&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Province/State&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;country_code&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Country code&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;country&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Country&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;headline&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Headline&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;credit&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Credit&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;source&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Source&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;copyright&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Copyright Notice&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;contact&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Contact&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;last_modfied&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Last modified&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;tool&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Program tool&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;format&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Format&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;width&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Image Width&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;height&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Image Height&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;flash&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Flash&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;latitude&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Latitude&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;longitude&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Longitude&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;altitude&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Altitude&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;lense&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Lense&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<h3>get the GPS data inside get_EXIF</h3>
<p>Now, every time you insert a new image or re-import the meta-data, the new tags will be asked. We need to change the get_EXIF function so it can find them.<br />
Still in lib/meta.php, go down to the get_EXIF function and change it to  :</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> get_EXIF<span class="br0">&#40;</span><span class="re0">$object</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_array</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</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="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <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">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;EXIF&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$exif</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;EXIF&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;FNumber&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;aperture&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">&#8216;F &#8216;</span> <span class="sy0">.</span> <a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_frac2dec</span><span class="br0">&#40;</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;FNumber&#8217;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">,</span> 2 <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Model&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;camera&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Model&#8217;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;DateTimeDigitized&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;created_timestamp&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> date_i18n<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span><span class="st_h">&#8216;date_format&#8217;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">&#8216; &#8216;</span> <span class="sy0">.</span> get_option<span class="br0">&#40;</span><span class="st_h">&#8216;time_format&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_date2ts</span><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;DateTimeDigitized&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;FocalLength&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;focal_length&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_frac2dec</span><span class="br0">&#40;</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;FocalLength&#8217;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="sy0">.</span> __<span class="br0">&#40;</span><span class="st_h">&#8216; mm&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ISOSpeedRatings&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;iso&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ISOSpeedRatings&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ExposureTime&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span> &nbsp;<span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_frac2dec</span> <span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ExposureTime&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span> &nbsp;<span class="sy0">=</span><span class="br0">&#40;</span><span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span> <span class="sy0">&gt;</span> 0<span class="sy0">.</span>0 and <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span> <span class="sy0">&lt;</span> <span class="nu19">1.0</span><span class="br0">&#41;</span> ? <span class="br0">&#40;</span> <span class="st_h">&#8217;1/&#8217;</span> <span class="sy0">.</span> <a href="http://www.php.net/round"><span class="kw3">round</span></a><span class="br0">&#40;</span> 1 <span class="sy0">/</span> <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="sy0">:</span> <span class="br0">&#40;</span><span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;shutter_speed&#8217;</span><span class="br0">&#93;</span> <span class="sy0">.=</span> &nbsp;__<span class="br0">&#40;</span><span class="st_h">&#8216; sec&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Bit 0 indicates the flash firing status</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Flash&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;flash&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> &nbsp;<span class="br0">&#40;</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Flash&#8217;</span><span class="br0">&#93;</span> <span class="sy0">&amp;</span> <span class="nu0">1</span> <span class="br0">&#41;</span> ? __<span class="br0">&#40;</span><span class="st_h">&#8216;Fired&#8217;</span><span class="sy0">,</span> <span class="st_h">&#8216;nggallery&#8217;</span><span class="br0">&#41;</span> <span class="sy0">:</span> __<span class="br0">&#40;</span><span class="st_h">&#8216;Not fired&#8217;</span><span class="sy0">,</span><span class="st_h">&#8216; nggallery&#8217;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;UndefinedTag:0xA434&#8242;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;lense&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;UndefinedTag:0xA434&#8242;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// additional information</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <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">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;IFD0&#8242;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$exif</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;IFD0&#8242;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Model&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;camera&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Model&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Make&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;make&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Make&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ImageDescription&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;title&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/utf8_encode"><span class="kw3">utf8_encode</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;ImageDescription&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Orientation&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;Orientation&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;Orientation&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// additional GPS information</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <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">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPS&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$exif</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">exif_data</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPS&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// send exif data to the function to get GPS on one line</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPSLatitudeRef&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$GPS</span><span class="sy0">=</span><span class="kw2">self</span><span class="sy0">::</span><span class="me2">get_Exif_GPS</span><span class="br0">&#40;</span><span class="re0">$exif</span><span class="sy0">,</span> 1<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;latitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$GPS</span><span class="br0">&#91;</span><span class="st_h">&#8216;latitude&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;longitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$GPS</span><span class="br0">&#91;</span><span class="st_h">&#8216;longitude&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;altitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$GPS</span><span class="br0">&#91;</span><span class="st_h">&#8216;altitude&#8217;</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; metres&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;timestamp&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$GPS</span><span class="br0">&#91;</span><span class="st_h">&#8216;timestamp&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;direction&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$GPS</span><span class="br0">&#91;</span><span class="st_h">&#8216;direction&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPSSatellites&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;satellites&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPSSatellites&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPSDateStamp&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$meta</span><span class="br0">&#91;</span><span class="st_h">&#8216;datestamp&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$exif</span><span class="br0">&#91;</span><span class="st_h">&#8216;GPSDateStamp&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>You can see two things here :<br />
- if the meta asked is &laquo;&nbsp;lense&nbsp;&raquo;, we look for the un-named attribute<br />
- when we are done with EXIF and IFD0, we check in the GPS array</p>
<h3>add a function to parse the GPS data and make them readable/usable by Google Map</h3>
<p>Now we create the function to re-calculate the GPS coords. Create a function somewhere in the class. A good place is at the end of the lib/meta.php file, just before the last closing bracket.</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> get_Exif_GPS<span class="br0">&#40;</span><span class="re0">$exif</span><span class="sy0">,</span> <span class="re0">$assoc</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//get the Hemisphere multiplier</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$LatM</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="re0">$LongM</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLatitudeRef&quot;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st_h">&#8216;S&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$LatM</span> <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLongitudeRef&quot;</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st_h">&#8216;W&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$LongM</span> <span class="sy0">=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//get the GPS data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatDegree&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLatitude&quot;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatMinute&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLatitude&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatgSeconds&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLatitude&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongDegree&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLongitude&quot;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongMinute&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLongitude&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongSeconds&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSLongitude&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;Altitude&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSAltitude&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeHour&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSTimeStamp&quot;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeMin&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSTimeStamp&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeSec&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSTimeStamp&quot;</span><span class="br0">&#93;</span><span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;direction&#8217;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$exif</span><span class="br0">&#91;</span><span class="st0">&quot;GPSImgDirection&quot;</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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//convert strings to numbers</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$gps</span> <span class="kw1">as</span> <span class="re0">$key</span> <span class="sy0">=&gt;</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pos</span> <span class="sy0">=</span> <a href="http://www.php.net/strpos"><span class="kw3">strpos</span></a><span class="br0">&#40;</span><span class="re0">$value</span><span class="sy0">,</span> <span class="st_h">&#8216;/&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$pos</span> <span class="sy0">!==</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$temp</span> <span class="sy0">=</span> <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st_h">&#8216;/&#8217;</span><span class="sy0">,</span><span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gps</span><span class="br0">&#91;</span><span class="re0">$key</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$temp</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy0">/</span> <span class="re0">$temp</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//calculate the decimal degree</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">&#8216;latitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$LatM</span> <span class="sy0">*</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatDegree&#8217;</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatMinute&#8217;</span><span class="br0">&#93;</span> <span class="sy0">/</span> 60<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LatgSeconds&#8217;</span><span class="br0">&#93;</span> <span class="sy0">/</span> 3600<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">&#8216;longitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$LongM</span> <span class="sy0">*</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongDegree&#8217;</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongMinute&#8217;</span><span class="br0">&#93;</span> <span class="sy0">/</span> 60<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;LongSeconds&#8217;</span><span class="br0">&#93;</span> <span class="sy0">/</span> 3600<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">&#8216;altitude&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;Altitude&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">&#8216;timestamp&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeHour&#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">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeMin&#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">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;TimeSec&#8217;</span><span class="br0">&#93;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span><span class="br0">&#91;</span><span class="st_h">&#8216;direction&#8217;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$gps</span><span class="br0">&#91;</span><span class="st_h">&#8216;direction&#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">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$assoc</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$result</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/json_encode"><span class="kw3">json_encode</span></a><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">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<h3>Conclusion</h3>
<p>Re-importing the meta-data of all your pictures should add the new stuffs.</p>
<p>I&#8217;v posted in the WordPress forum and asked for this to be added to the NextGen Gallery dev tree. Still have no answer for now. Maybe someone will come with a better code or better idea ?<br />
I also asked for someone to check how GPS data are included in files from other brands as I can only tell for the Nikon&#8217;s D700.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/1201/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery tricks and notes</title>
		<link>http://www.lecentre.net/blog/archives/1193</link>
		<comments>http://www.lecentre.net/blog/archives/1193#comments</comments>
		<pubDate>Tue, 04 Jan 2011 13:32:29 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Dev]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=1193</guid>
		<description><![CDATA[jQuery is a well known JavaScript &#171;&#160;framework&#160;&#187;. It have unique features for DOM manipulation and web page animations. Another one is MooTools, said to be better in animations. When you&#8217;re on a webpage with sliding images (orbit, novo slider&#8230;), growing windows or overlays&#8230; you can be pretty sure they are using one of these frameworks. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jquery.com/"><img class="alignleft size-full wp-image-1194" title="logo_jquery_215x53" src="http://www.lecentre.net/blog/wp-content/uploads/2011/01/logo_jquery_215x53.gif" alt="" width="215" height="53" /></a> <a title="jQuery" href="http://jquery.com/" target="_blank">jQuery</a> is a well known JavaScript &laquo;&nbsp;framework&nbsp;&raquo;. It have unique features for DOM manipulation and web page animations. Another one is <a title="MooTools" href="http://mootools.net/" target="_blank">MooTools</a>, said to be better in animations.</p>
<p>When you&#8217;re on a webpage with sliding images (orbit, novo slider&#8230;), growing windows or overlays&#8230; you can be pretty sure they are using one of these frameworks. The latest versions of WordPress bundle jQuery. As I wanted a special theme for my photo-blog (not yet finished but can be seen <a title="blog photo Lecentre.net" href="http://blog.lecentre.net" target="_blank">here</a>), I had to dig in jQuery.</p>
<p>While the jQuery basis is really simple, somehow well documented on their website and full of examples on the net, you still have tricks to know so your code is 100% efficient, bug free and more important cross browser compatible (I mean, compatible with IE 6/7).</p>
<p>I will reference here the pages/people talking of such hints, tricks and notes, and maybe give my own recommendations and discoveries.</p>
<p>First one is actualy mine, even if it&#8217;s obvious : install Firebug or enable Safari Developper options in your browser. This way, just right-clic on a part of a webpage and &laquo;&nbsp;Inspect&nbsp;&raquo; it.<br />
Most of jQuery scripts are in &laquo;&nbsp;full text&nbsp;&raquo;, not minified or obfuscated. Or, at least, you will find clues of the author, the licence&#8230; and be able to use it, copy/modify it or just be insipred.</p>
<p>Second one is a must-read when you already know the basis of jQuery. It&#8217;s a 14 point tricks/notes from Jeffrey Way and located at <a title="14 jQuery Tricks" href="http://net.tutsplus.com/tutorials/javascript-ajax/14-helpful-jquery-tricks-notes-and-best-practices/" target="_blank">http://net.tutsplus.com</a></p>
<p>They also have two other interresting articles about <a title="jQuery Hidden Features" href="http://net.tutsplus.com/tutorials/javascript-ajax/uncovering-jquerys-hidden-features/" target="_blank">Hidden Features</a> and <a title="jQuery Animation" href="http://net.tutsplus.com/tutorials/javascript-ajax/jquery-animations-a-7-step-program/" target="_blank">Animation</a>.</p>
<p>I would also like to add two blogs/website of people providing great examples and tutorials for free :</p>
<ul>
<li><a title="Malihu" href="http://manos.malihu.gr/" target="_blank">Malihu</a></li>
<li><a title="Codrops" href="http://tympanus.net/codrops/category/tutorials/" target="_blank">Codrops</a></li>
</ul>
<p>More will come</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/1193/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sending SMS from Nagios</title>
		<link>http://www.lecentre.net/blog/archives/985</link>
		<comments>http://www.lecentre.net/blog/archives/985#comments</comments>
		<pubDate>Thu, 17 Dec 2009 13:10:24 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=985</guid>
		<description><![CDATA[Sometimes you need to be able to send SMS from a computer. This is obvious when you&#8217;re talking of monitoring your servers. Email alerts are good, but what if you&#8217;re sleeping ? I used to set up a SMS modem, with it&#8217;s own SIM card and subscription. This is really easy, using smsd daemon, to [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-986" title="logo" src="http://www.lecentre.net/blog/wp-content/uploads/2009/12/logo-250x63.png" alt="logo" width="250" height="63" /></p>
<p>Sometimes you need to be able to send SMS from a computer. This is obvious when you&#8217;re talking of monitoring your servers. Email alerts are good, but what if you&#8217;re sleeping ?<br />
I used to set up a SMS modem, with it&#8217;s own SIM card and subscription. This is really easy, using smsd daemon, to send SMS. Just put a formated file in a directory and bam!, you SMS is fired.<br />
But what when you can&#8217;t set a SMS Modem in a datacenter ?</p>
<p>Then you have to use an online SMS provider.</p>
<li>Good</li>
<p><span style="color: #339966;"><span style="background-color: #ffffff;">you just have to call an API to send a SMS</span></span></p>
<li>BAD</li>
<p><span style="color: #ff0000;">it&#8217;s not free (you pay per SMS when the modem can have an unlimited SMS sending subscription<br />
it is network dependant ; if you have a network failure, you will never be informed</span></p>
<p><span id="more-985"></span></p>
<p>Once you know that, you can start using it.<br />
I will set up two monitoring plateforms : one inside the datacenter, monitoring every services and local network and one outside, on a hosted server somewhere else, to check the network connecivity of the datacenter.</p>
<p>As our main monitoring is using Nagios, I had to write scripts for it. I now have 2 python scripts : one for sending SMS, one to check how many SMS I have on my account.</p>
<p>I first had a quick look on the french SMS providers. I chosed <a href="http://www.smsenvoi.com">www.smsenvoi.com</a> as they are one of the cheapest and the http and mail API are free (yes, some providers make you pay for that !!). They are also based in Marseilles. I&#8217;m happy thinking people there can do better than people from Paris <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>So, let&#8217;s dig the http API. You can find it at <a title="http://www.smsenvoi.com/pgs_api.php" href="http://www.smsenvoi.com/pgs_api.php" target="_blank">http://www.smsenvoi.com/pgs_api.php</a><br />
It&#8217;s quite simple, even if ugly : you send data in POST request, like : userLogin=your.account@domain.com&amp;userPassword=your_password_clear&amp;&#8230;<br />
And call a page, depending on your need :</p>
<ul>
<li>smsEnvoi.php : send a message</li>
</ul>
<ul>
<li>smsNumber.php : see how many SMS you have availlable in your account</li>
</ul>
<ul>
<li>smsStatus.php and smsMNC.php : check if a SMS have been sent (this is used when you do mass sending)</li>
</ul>
<p>You can do pretty neat things. Just check on their website what the URL&#8217;s are.<br />
To be honest, I only re-write, in a simple way, what the PHP code do but in Python.</p>
<p>You can find the two scripts attached.<br />
<strong>sendSMS.py</strong> take a message from the line input and send it. You have to start it for each recipient. Even if it&#8217;s easy to add many recipient at the same time, Nagios can&#8217;t do that. I&#8217;m just keeping it simple.<br />
<strong>check_sms_free</strong> is a script (nagios check formated) to check how many SMS you still have in your account. The Nagios check is defines to be at WARNING state when only 50 SMS are availlable and in CRITICAL state when only 10 are.</p>
<p>Here are the Nagios config (I do have it in Nconf, but here is what is generated in the statis Nagios file) :</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 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;host-notify-by-sms</div>
</li>
<li class="li1">
<div class="de1">command_line &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw3">printf</span> <span class="st0">&quot;%b&quot;</span> <span class="st0">&quot;Type: <span class="es2">$NOTIFICATIONTYPE</span>$ &#8211; Host: <span class="es2">$HOSTALIAS</span>$ &#8211; Address: <span class="es2">$HOSTADDRESS</span>$ &#8211; State: <span class="es2">$HOSTSTATE</span>$ &#8211; Date: <span class="es2">$LONGDATETIME</span>$ &#8211; Info: <span class="es2">$HOSTOUTPUT</span>$&quot;</span> <span class="sy0">|</span> <span class="sy0">/</span>opt<span class="sy0">/</span>monitor<span class="sy0">/</span>nagios<span class="sy0">/</span>scripts<span class="sy0">/</span>sendSMS.py <span class="re5">&#8211;login</span>=<span class="re1">$USER8</span>$ <span class="re5">&#8211;passwd</span>=<span class="re1">$USER9</span>$ <span class="re5">&#8211;smsserver</span>=www.smsenvoi.com <span class="re5">&#8211;receivers</span>=+<span class="re1">$CONTACTPAGER</span>$ <span class="re5">&#8211;smsfrom</span>=monitor-prod</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">define <span class="kw3">command</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">command_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;notify-by-sms</div>
</li>
<li class="li1">
<div class="de1">command_line &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw3">printf</span> <span class="st0">&quot;%b&quot;</span> <span class="st0">&quot;Type: <span class="es2">$NOTIFICATIONTYPE</span>$ &#8211; Service: <span class="es2">$SERVICEDESC</span>$ &#8211; Host: <span class="es2">$HOSTALIAS</span>$ &#8211; State: <span class="es2">$SERVICESTATE</span>$ &#8211; Date: <span class="es2">$LONGDATETIME</span>$ &#8211; Info: <span class="es2">$SERVICEOUTPUT</span>$&quot;</span> <span class="sy0">|</span> <span class="sy0">/</span>opt<span class="sy0">/</span>monitor<span class="sy0">/</span>nagios<span class="sy0">/</span>scripts<span class="sy0">/</span>sendSMS.py <span class="re5">&#8211;login</span>=<span class="re1">$USER8</span>$ <span class="re5">&#8211;passwd</span>=<span class="re1">$USER9</span>$ <span class="re5">&#8211;smsserver</span>=www.smsenvoi.com <span class="re5">&#8211;receivers</span>=<span class="re1">$CONTACTPAGER</span>$ <span class="re5">&#8211;smsfrom</span>=monitor-prod</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">define <span class="kw3">command</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">command_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;check_sms_free</div>
</li>
<li class="li1">
<div class="de1">command_line &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$USER1</span>$<span class="sy0">/</span>check_sms_free <span class="re5">&#8211;login</span>=<span class="re1">$USER8</span>$ <span class="re5">&#8211;passwd</span>=<span class="re1">$USER9</span>$ <span class="re5">&#8211;smsserver</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="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>Define the username and password for the <strong>smsenvoi</strong> account in resource.cfg as $USER8$ and $USER9$</p>
<p>Then, you can add the check to a host :</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">define service <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">service_description &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_sms_free</div>
</li>
<li class="li1">
<div class="de1">check_command &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_sms_free<span class="sy0">!</span>www.smsenvoi.com<span class="sy0">!</span><span class="nu0">50</span><span class="sy0">!</span><span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">host_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localhost</div>
</li>
<li class="li1">
<div class="de1">check_period &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;24&#215;7</div>
</li>
<li class="li1">
<div class="de1">notification_period &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 24&#215;7</div>
</li>
<li class="li1">
<div class="de1">contact_groups &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;admins,sysadmins</div>
</li>
<li class="li1">
<div class="de1">event_handler_enabled &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1">active_checks_enabled &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">passive_checks_enabled &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">notifications_enabled &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">check_freshness &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1">freshness_threshold &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">86400</span></div>
</li>
<li class="li1">
<div class="de1">use &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Default_timeperiod_interval_5</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>Don&#8217;t forget to define the cellphone number of each users in the &laquo;&nbsp;PAGER&nbsp;&raquo; field :</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">define contact <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">contact_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">@</span>lecentre.net-sms</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alias</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sms lecentre</div>
</li>
<li class="li1">
<div class="de1">host_notification_options &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d,r</div>
</li>
<li class="li1">
<div class="de1">service_notification_options &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c,r</div>
</li>
<li class="li1">
<div class="de1">email &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">@</span>lecentre.net</div>
</li>
<li class="li1">
<div class="de1">pager &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +<span class="nu0">33682887766</span></div>
</li>
<li class="li1">
<div class="de1">host_notification_period &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;24&#215;7</div>
</li>
<li class="li1">
<div class="de1">service_notification_period &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 24&#215;7</div>
</li>
<li class="li1">
<div class="de1">host_notification_commands &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;host-notify-by-sms</div>
</li>
<li class="li1">
<div class="de1">service_notification_commands &nbsp; &nbsp; &nbsp; &nbsp; notify-by-sms</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>Note the format of the phone number, with international format, starting with +<br />
And voila&#8230;<br />
Find the two scripts here : <a title="sendSMS.py" href="http://www.lecentre.net/blog/download/sendSMS.py" target="_blank">sendSMS.py</a> and <a title="check_sms_free" href="http://www.lecentre.net/blog/download/check_sms_free" target="_blank">check_sms_free</a></p>
<p>Todos :<br />
- limit the message size to 160 caracters, which is the max for a single SMS. If you send messages longer, they will count as two SMS.<br />
- catch every exception in the httplib Python framework (this is really basic for the moment)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/985/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>computer stuffs&#8230;</title>
		<link>http://www.lecentre.net/blog/archives/858</link>
		<comments>http://www.lecentre.net/blog/archives/858#comments</comments>
		<pubDate>Mon, 19 Oct 2009 04:47:01 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/?p=858</guid>
		<description><![CDATA[The main purpose of this blog is to act as a reminder, a todo. Here are things i&#8217;ve just found and needs a second look at, or more, a testing. Human readable Glassfish Log This is a shell (sh) script that should made things easier when having a look or doing a &#171;&#160;tail -f&#160;&#187; at [...]]]></description>
			<content:encoded><![CDATA[<p>The main purpose of this blog is to act as a reminder, a todo. Here are things i&#8217;ve just found and needs a second look at, or more, a testing.</p>
<li><a href="http://humglassfishlog.sourceforge.net/">Human readable Glassfish Log</a></li>
<p>This is a shell (sh) script that should made things easier when having a look or doing a &laquo;&nbsp;tail -f&nbsp;&raquo; at Glassfish error logs.</p>
<li><a href="http://blogs.sun.com/aquatic/">Rajeshwar&#8217;s Weblog</a></li>
<p>This is a blog, lately talking about Glassfish V3 REST api implementation. As far as I know this is (still) not working with GF v2, which already have JMX and, if you&#8217;re a registered Sun user, SNMP. But worth having a look.</p>
<li><a href="http://beet.sourceforge.net">Beet</a></li>
<p>It seems to me that most of developpers are using Spring framework nowadays. This tool should enable them (or force them ?) to have a deeper look of what the framework is actualy doing. Seriously, comments welcome. May be the weapon of choice for sysadmins like me, dealing with developpers who hide behing their framework (like if the framework was an excuse&#8230; huhuhu).</p>
<li><a href="http://pandorafms.org/index.php?sec=project&#038;sec2=home&#038;lang=en">PandoraFMS</a></li>
<p>Another monitoring software&#8230; well&#8230; to be tested.</p>
<li><a href="http://www.oracle.com/technology/pub/articles/mearelli-igoogle.html">Oracle Database-backed iGoogle Gadgets</a></li>
<p>An interesting thing you can do with Google&#8217;s API&#8230; It should with any database, but hey, a free software working with Oracle is worth beeing mentioned <img src='http://www.lecentre.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<li><a href="http://www.oracle.com/technology/pub/articles/index.html">Other Oracle related articles</a></li>
<li><a href="http://download.oracle.com/otn_hosted_doc/timesten/603/TimesTen-Documentation/arch.pdf">Oracle TimesTen In-Memory Database</a></li>
<p>This is a PDF file dealing with TimesTen Database. This is a product newly (2 or 3 years) bought by Oracle, and well integrated. Embed the database close to the application, in the application server. Data are replicated at startup. You can choose which database, which table, which data using a filter, or even do transformations to the data. You select the synchronization frequency and there you go. I had a session OOW 2009 about that and how it was used to break a CDN application in two parts : one for slow data change (read/write to the DB) and one for massive fast queries on the delivery side. Ok, this use a lot of RAM&#8230; but RAM is cheap isn&#8217;t it ?</p>
<p>Now we have some cool things to read and test, don&#8217;t we ? <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/858/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un peu de lecture&#8230;</title>
		<link>http://www.lecentre.net/blog/archives/241</link>
		<comments>http://www.lecentre.net/blog/archives/241#comments</comments>
		<pubDate>Wed, 27 Feb 2008 11:19:05 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/241</guid>
		<description><![CDATA[Tutoriel sur l&#8217;injection SQL : http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm Oracle Performance Tuning Guide Un bon blog sur Oracle : http://sysdba.wordpress.com/  A lire sur Python / Django : VirtuelEnv, qui permet de gerer des &#171;&#160;package d&#8217;installation&#160;&#187; de Python, et garder la distrib de base &#171;&#160;propre&#160;&#187; Un exemple d&#8217;utilisation de VirtualEnv Un autre blogger qui parle de VirtualEnv (lire les [...]]]></description>
			<content:encoded><![CDATA[<p>Tutoriel sur l&#8217;injection SQL : <a href="http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm" target="_blank">http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm</a></p>
<p><a href="http://www.comp.dit.ie/btierney/Oracle11gDoc/server.111/b28274/toc.htm" target="_blank">Oracle Performance Tuning Guide</a></p>
<p>Un bon blog sur Oracle : <a href="http://sysdba.wordpress.com/" target="_blank">http://sysdba.wordpress.com/ </a></p>
<p>A lire sur Python / Django :</p>
<p><a href="http://pypi.python.org/pypi/virtualenv/1.0" target="_blank">VirtuelEnv</a>, qui permet de gerer des &laquo;&nbsp;package d&#8217;installation&nbsp;&raquo; de Python, et garder la distrib de base &laquo;&nbsp;propre&nbsp;&raquo;<br />
Un <a href="http://grok.zope.org/documentation/how-to/using-virtualenv-for-a-clean-grok-installation" target="_blank">exemple d&#8217;utilisation</a> de VirtualEnv<br />
<a href="http://blog.doughellmann.com/2007/11/virtualenv.html" target="_blank">Un autre blogger</a> qui parle de VirtualEnv (lire les commentaires)</p>
<p>Et n&#8217;oubliez pas d&#8217;installer easy_install <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/241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building MacPorts Py-Mysql on Leopard</title>
		<link>http://www.lecentre.net/blog/archives/235</link>
		<comments>http://www.lecentre.net/blog/archives/235#comments</comments>
		<pubDate>Fri, 15 Feb 2008 21:46:24 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/235</guid>
		<description><![CDATA[If you installed over your old Tiger or if you are new user, you may have experienced errors when trying to build py-mysql.Py-mysql is a Python module to connect to Mysql.I&#8217;m using it to have Django, the Python Web Framework, to connect to Mysql database. This is what I got when trying to install :   # [...]]]></description>
			<content:encoded><![CDATA[<p>If you installed over your old Tiger or if you are new user, you may have experienced errors when trying to build py-mysql.Py-mysql is a Python module to connect to Mysql.I&#8217;m using it to have Django, the Python Web Framework, to connect to Mysql database. This is what I got when trying to install :  
<pre lang="bash"># port install py-mysql
--->  Building py-mysql with target build
Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_python_py-mysql/work/MySQL-python-1.2.2" &#038;&#038; /opt/local/bin/python2.4 setup.py build " returned error 1
Command output: running build
running build_py
copying MySQLdb/release.py -> build/lib.macosx-10.3-ppc-2.4/MySQLdb
running build_ext
building '_mysql' extension
/usr/bin/gcc-4.0 -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -Dversion_info=(1,2,2,'final',0) -D__version__=1.2.2 -I/opt/local/include/mysql5/mysql -I/opt/local/Library/Frameworks/Python.framework/Versions/2.4/include/python2.4 -c _mysql.c -o build/temp.macosx-10.3-ppc-2.4/_mysql.o
In file included from /opt/local/include/mysql5/mysql/mysql.h:47,
                 from _mysql.c:40:
/usr/include/sys/types.h:92: error: duplicate 'unsigned'
/usr/include/sys/types.h:92: error: two or more data types in declaration specifiers
error: command '/usr/bin/gcc-4.0' failed with exit status 1

Error: Status 1 encountered during processing.
</pre>
<p>I tried to upgrade MacPorts&#8230; but I already had the latest.</p>
<pre lang="bash"># port selfupdate

MacPorts base version 1.600 installed

Downloaded MacPorts base version 1.600

The MacPorts installation is not outdated and so was not updated
selfupdate done!</pre>
<p>I finaly found the solution on <a href="http://rob.cogit8.org/blog/2007/Nov/14/installing-django-leopard-mac-os-105/" target="_blank">http://rob.cogit8.org/blog/2007/Nov/14/installing-django-leopard-mac-os-105/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/235/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google is everywhere</title>
		<link>http://www.lecentre.net/blog/archives/166</link>
		<comments>http://www.lecentre.net/blog/archives/166#comments</comments>
		<pubDate>Fri, 28 Dec 2007 16:10:16 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/166</guid>
		<description><![CDATA[One new API from Google. This one allow you to create charts (graphiques, pour les francophones). Philippe Mougin is our guest and comes with a clean example with integration to Apple&#8217;s Cocoa programming. Check this here.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lecentre.net/blog/wp-content/uploads/2007/12/chart.png" alt="Google Chart" /></p>
<p>One new API from Google. This one allow you to create charts (graphiques, pour les francophones).</p>
<p>Philippe Mougin is our guest and comes with a clean example with integration to Apple&#8217;s Cocoa programming. <a href="http://pmougin.wordpress.com/2007/12/10/google-chart-api-fun-with-cocoa-and-f-script/" title="http://pmougin.wordpress.com/2007/12/10/google-chart-api-fun-with-cocoa-and-f-script/" target="_blank">Check this here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/166/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faire du python dans automator (Leopard)</title>
		<link>http://www.lecentre.net/blog/archives/165</link>
		<comments>http://www.lecentre.net/blog/archives/165#comments</comments>
		<pubDate>Fri, 28 Dec 2007 16:03:29 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/165</guid>
		<description><![CDATA[Voila le site d&#8217;une personne qui a une solution. Cela interessera particulierement mon ami Akhen, qui fete son anniversaire demain. Tiens, c&#8217;est pour toi : http://toxicsoftware.com/run-python-script/]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lecentre.net/blog/wp-content/uploads/2007/12/2110974754_6e5540298b_o.png" alt="http://toxicsoftware.com/run-python-script" /></p>
<p>Voila le site d&#8217;une personne qui a une solution. Cela interessera particulierement mon ami Akhen, qui fete son anniversaire demain. Tiens, c&#8217;est pour toi : <a href="http://toxicsoftware.com/run-python-script/" title="http://toxicsoftware.com/run-python-script/" target="_blank">http://toxicsoftware.com/run-python-script/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/165/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>une fiche memo pour Django</title>
		<link>http://www.lecentre.net/blog/archives/15</link>
		<comments>http://www.lecentre.net/blog/archives/15#comments</comments>
		<pubDate>Fri, 08 Jun 2007 22:15:17 +0000</pubDate>
		<dc:creator>Prune</dc:creator>
				<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.lecentre.net/blog/archives/15</guid>
		<description><![CDATA[C&#8217;est pas nouveau mais je viens de tomber la dessus. Ca peut etre pratique, surtout que je vais essayer de m&#8217;y remettre un peu&#8230; bref, c&#8217;est ici]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est pas nouveau mais je viens de tomber la dessus. Ca peut etre pratique, surtout que je vais essayer de m&#8217;y remettre un peu&#8230;<br />
bref, c&#8217;est <a href="http://www.mercurytide.com/whitepapers/django-cheat-sheet/">ici</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lecentre.net/blog/archives/15/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

