Stories

Getting the IPs from AWS on a load balancer using Piwik Stats

Posted on Updated on

I’ll keep this short and give the general gist of this.

Basically I had a problem, whereby Piwik was not getting the correct IP of the visitor, as the AWS setup was not passing the correct IP through on the expected value.

Try this code out as a test and see what you get.

Getting server/client IP:<br>

<?php
var_dump($_SERVER['SERVER_ADDR']);
var_dump($_SERVER['SERVER']); 
var_dump($_SERVER['HTTP_X_FORWARDED_PORT']);
var_dump($_SERVER['HTTP_X_FORWARDED_PROTO']);
var_dump($_SERVER['HTTP_X_FORWARDED_FOR']);
var_dump($_SERVER['SERVER_ADDR']);
var_dump($_SERVER['SERVER_PORT']);
var_dump($_SERVER['REMOTE_ADDR']);

echo "1: " . $_SERVER['SERVER_ADDR'] . "<br>";
echo "2: " . $_SERVER['SERVER'] . "<br>";
echo "3: " . $_SERVER['HTTP_X_FORWARDED_PORT'] . "<br>";
echo "4: " . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "<br>";
echo "5: " . $_SERVER['HTTP_X_FORWARDED_FOR'] . "<br>";
echo "6: " . $_SERVER['SERVER_ADDR'] . "<br>";
echo "7: " . $_SERVER['SERVER_PORT'] . "<br>";
echo "8: " . $_SERVER['REMOTE_ADDR'] . "<br>";

echo phpinfo();
?>

As an intro, to help you figure out the correct value, use the above code as a test.

The problem with the suggestions on the Piwik site saying to make changes to these files, is that is didn’t work for me.

[General]
; Uncomment line below if you use a standard proxy
;proxy_client_headers[] = HTTP_X_FORWARDED_FOR
;proxy_host_headers[] = HTTP_X_FORWARDED_HOST

; Uncomment line below if you use CloudFlare
;proxy_client_headers[] = HTTP_CF_CONNECTING_IP

; Uncomment line below if you use another proxy (that sets Client-IP header)
;proxy_client_headers[] = HTTP_CLIENT_IP

You have more luck, but it’s for viewing here: https://piwik.org/faq/how-to-install/faq_98/

So, while there are many values in Piwik to have various settings, it’s worth filling in as many as possible…

The key value for this IP issue is this:

$IP_Tracker = $_SERVER['HTTP_X_FORWARDED_FOR'];

Here’s an example that will probably work for you. It’s pulled from a live site, but modified for anonymous use).

<?php

global $IDSITE;
$IDSITE = 2;  
    
// This is so we can get the correct IP of the visitor from behind the AWS load balancer.    
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
    { $IP_Tracker = $_SERVER['HTTP_X_FORWARDED_FOR'];} else
    { $IP_Tracker = $_SERVER['REMOTE_ADDR']; }
$pagetitle = "Home"; // The name of the tab for the stats.
// Tracking Code
// -- Piwik Tracking API init -- 
require_once "PiwikTracker.php";
PiwikTracker::$URL = 'http://loadbalancer.serverlocation.com/piwik/';

$t = new PiwikTracker( $IDSITE, 'http://loadbalancer.serverlocation.com/piwik/');

// End of configuration settings.  

// Optional function calls
$t->setUserAgent($_SERVER['HTTP_USER_AGENT']);
$t->setBrowserLanguage('en');
$vid = '';

// Allow the follow-through tracking from page to page. - Visitor ID
if( isset($_POST['vid']) ) { $vid = addslashes($_POST['vid']); } else { if( isset($_GET['vid']) ) { $vid = addslashes($_GET['vid']); } }; // get vid
if(strlen($vid) > 10 && strlen($vid)< 30) { $t->setVisitorId($vid); }; // double check it
 
// If you want to force the visitor IP, or force the server date time to a date in the past,
// it is required to authenticate the Tracking request by calling setTokenAuth
// You can pass the Super User token_auth or any user with 'admin' privilege on the website $idSite

$token_auth = "YOURTOKEN";
$t->setTokenAuth( $token_auth );
$t->setIp( $IP_Tracker );
  
// If you wanted to force to record the page view or conversion to a specific visitorId
$t->setUrl($url = 'https://app.yoursever.com/2015_home_tab.php');

// Finally, track the page view with a Custom Page Title
// In the standard JS API, the content of the <title> tag would be set as the page title
$t->doTrackPageView($pagetitle);
?>

<a href="http://app.yoursitecom/page2.php?vid=<?php echo $t->getVisitorId(); ?>">Page 2</a>

 

 

 

 

 

Advertisements

Artist and Song search of Spotify and iTunes via web URL

Posted on Updated on

This took me a while to find out how to do, so I thought I’d share my research to you.

I had a problem where I wanted users to be able to click on a link and it would open up the Spotify, or iTunes program to the search results of the values I passed it.

As mentioned, this took a long while to get. The Spotify one was easy as, and they should be commended for their simplicity. The iTunes one was not as easy to find.

So, this is my resulting code example, which I hope will help you in the future.

See this example work in JSFiddle
https://jsfiddle.net/vr_driver/e4q2nme3/13/

HTML Code

&lt;a href="https://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/advancedSearch?genreIndex=1&amp;media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=tobyMac&amp;allTitle=Love+Broke+Thru"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt;Apple iTunes&lt;/a&gt;
&lt;a href="spotify:search:tobyMac+Love+Broke+Thru"&gt;&lt;i class="fa fa-spotify"&gt;&lt;/i&gt;Spotify&lt;/a&gt;

PHP Source Code

$artist = "TobyMac";
$title = "Love Broke Through";
echo '&lt;a href="spotify:search:' . str_replace(" ","+",$artist) . "+" . str_replace(" ","+",$title) . '"&gt;&lt;i class="fa fa-spotify"&gt;&lt;/i&gt; Spotify&lt;/a&gt;';
echo '&lt;a href="https://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/advancedSearch?genreIndex=1&amp;media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=' . str_replace(" ","+",$artist) . "&amp;allTitle=" . str_replace(" ","+",$title) . '"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt; iTunes&lt;/a&gt;';

// Or so the browser opens a window and then closes it.
$iTunes_link = "https://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/advancedSearch?genreIndex=1&amp;media=music&amp;restrict=true&amp;submit=seeAllLockups&amp;entity=songs&amp;allArtistNames=". str_replace(" ","+",$artist) . "&amp;allTitle=" . str_replace(" ","+",$title);
echo '&lt;a href="javascript:closeOnLoad(\'' . $iTunes_link. '\');"&gt;&lt;i class="fa fa-apple"&gt;&lt;/i&gt;&lt;/a&gt;';

JS

&lt;script type="text/Javascript"&gt;
function closeOnLoad(myLink)
{
    var newWindow = window.open(myLink);
    newWindow.blur();
    setTimeout
    (
	function()
	{
	  newWindow.close();
	},
	1000
    );
};
&lt;/script&gt;

Both of these examples do 2 different things.
The Full iTunes example opens up a new window by JS and then closes it a second later. This is to allow the page to load, and then have the Apple page call the iTunes program. It then opens it to an advanced search page (which until I started playing with this stuff didn’t even know existed).

The Spotify example just opens the app directly if you have it installed – if you don’t use WordPress of course. They’ve wrecked the link in the example by removing the “spotify:search:” at the front of the link.

If this has helped you, please let me know, I’d love to hear, even send me a donation through PayPal.

Cloudflare is great – most of the time.

Posted on Updated on

So for the last month or so, I’ve given a few sites the Cloudflare boost. The DNS has come up faster, pages and the sites work much better.

However, I’ve discovered something it doesn’t work so well for…

I run GLPI and it’s great for computer digital asset management.

However today I discovered how frustrating it can be as well for certain applications. On my CMS and other static sites I have no problems with it, as it compresses the JS, CSS and HTML for speed – which is good.

But. As it turns out, GLPI doesn’t play nicely with a feature that CloudFlare offer. Granted, they call it BETA technology so I will give them that, but, after having upgraded my version to the latest and still have it breaking and breaking other parts that were not broken originally, I managed to finally figure out the problem.

The JS that Cloudflare inserts breaks pretty much every “html::” POST class in GLPI.

So, the solution is to disable what they call “Rocketscript”, and your site will work fine.

These pages will explain it a little better:

http://webmasters.stackexchange.com/questions/60276/how-does-cloudflares-rocket-loader-actually-work-and-how-can-a-developer-ensur
https://laracasts.com/discuss/channels/javascript/rocketscript-what-is-it
https://snippets.webaware.com.au/snippets/stop-cloudflare-rocketscript-breaking-wordpress-plugin-scripts/

Full Screen Webpage HTML5 API

Posted on Updated on

This code will make your website go in to a full screen view, with the click of a button.

Or, if you prefer, you can press CTL + ` instead.

I modified the original code from sitepointstatic.com with the keyboard shortcut, but it’s still basically the same.

          <span id="fullscreen">Go Full Screen</span>
JS Script:

        // full screen script         
        // http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html
        var e = document.getElementById("fullscreen"); // button for activation.
        // var b = document.getElementById("body");  // Does not allow scrolling- good for individual elements, like pictures or video.
        var b = document.documentElement; // Does allow scrolling
        e.onclick = function() {
            if (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) {
                RunPrefixMethod(document, "CancelFullScreen");
            }
            else {
                RunPrefixMethod(b, "RequestFullScreen");
            }
        }
        
        var pfx = ["webkit", "moz", "ms", "o", ""];
        function RunPrefixMethod(obj, method) {
            var p = 0, m, t;
            while (p < pfx.length && !obj[m]) {
                m = method;
                if (pfx[p] == "") {
                    m = m.substr(0,1).toLowerCase() + m.substr(1);
                }
                m = pfx[p] + m;
                t = typeof obj[m];
                if (t != "undefined") {
                    pfx = [pfx[p]];
                    return (t == "function" ? obj[m]() : obj[m]);
                }
                p++;
            } 
        }
        
        // keydown event handler
        document.addEventListener('keydown', function(e) {
          if (e.ctrlKey && e.keyCode == 192) { // ` AND CTL
        RunPrefixMethod(b, "RequestFullScreen");
          }
        }, false);

Fail2Ban – You will lock yourself out

Posted on Updated on

There are parts I love about being able to manage a VPS, but there are parts I hate.

One of the biggest problems is if you get passwords wrong. Yep… It happens.

So when your server blocks your static IP, it gets difficult to get back in.

It’s not impossible, but, once you do you have to unblock yourself.

This took me a while to find, but it actually works, especially if you are running a Centos box with f2b.

Remove IP from blocklist

check its being blocked by running

iptables -L -n

if it is, unblock it by running

iptables -D <CHAIN> -s <IP>  -j <ACTION>

where <IP> is the one you want to remove, <ACTION> is what it does and <CHAIN> is the ruleset its blocked under. Some examples below;

iptables -L -n
...
Chain f2b-default (2 references)
target     prot opt source               destination
REJECT     all  --  217.147.243.129      anywhere             reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere
...
server:# iptables -D f2b-default -s 217.147.243.129 -j REJECT # remove it
server:# /sbin/service iptables save 

Whitelisting

Whitelisting is setup in the jail.conf file using a space separated list.

[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not                          
# ban a host which matches an address in this list. Several addresses can be                             
# defined using space separator.
                                                                         
ignoreip = 127.0.0.1 192.168.1.0/24 8.8.8.8 XXX.XXX.XXX.XXX
# where the XXX.etc is your static IP.

# This will ignore connection coming from common private networks.
# Note that local connections can come from other than just 127.0.0.1, so
# this needs CIDR range too.
ignoreip = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

Source: http://wiki.vitro.co.uk/mw/Fail2ban

JS: OnDrop not getting the source ID [solved]

Posted on Updated on

So this problem plagued me for several days before I finally figured it out.

For example, you have the following code and it works:

< script >
function allowDrop(ev) { 
 ev.preventDefault(); 
 } 
function drag(ev) { 
 ev.dataTransfer.setData('text', ev.target.id); 
 } 
function drop(ev, target) { 
 ev.preventDefault(); 
console.log(target.id + " : " + ev.target.id) 
console.log(ev.dataTransfer.getData("text/html")); 
console.log(ev.dataTransfer.getData("text")); 
var data = ev.dataTransfer.getData("text"); 
alert(data) 
 } 
< / script >

<style "type="text/css">
#div1 { 
 width: 350px; 
 height: 70px; 
 padding: 10px; 
 border: 1px solid #aaaaaa; 
 }
</style>
< div id="div1" ondrop="drop(event, this)" ondragover="allowDrop(event)">
</div >
  
<img draggable="true" ondragstart="drag(event)" 
id="drag1" src="//placehold.it/336X69/ff0000" width="336" height="69" />

However, what if you changed the HTML code to this:

<a draggable="true" ondragstart="drag(event)" id="drag1" href="#">
 <img src="//placehold.it/336X69/ff0000" width="336" height="69" />
</a>

Well, put simply, it won’t work.

This won’t work either – even though the drag code is correct. It simply can’t be in an ‘A’ tag, like the following code.
<a href="#">
 < img draggable="true" ondragstart="drag(event)" id="drag1"
 src="//placehold.it/336X69/ff0000" width="336" height="69" />
 </a>

An “a” won’t return the source id in this instance. Why? I don’t know. But it won’t work, so don’t do it.

To make a drop and drag work properly in all browsers, the ondragstart must not be on an ‘A’ tag. IMG are ok. maybe even LI, or DIV – but not A.

I hope this helps. It took me a long time and a lot of JS code to find alternatives, but it was a simple fix in the end.

This has been confirmed to work on the following:

Safari:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14

Opera:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 OPR/42.0.2393.94

FireFox:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0

Chrome:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36

Opera Dev:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2914.3 Safari/537.36 OPR/43.0.2431.0 (Edition developer)

 FireFox Dev:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0

 

While this code example isn’t perfect, and WordPress keep on messing up the formatting and the actual content of this page, I’ll keep adding to it to get it 100% right.

Please note the extra spaces in the code there, at the script and div tags. This is because WordPress is breaking it on me.

It’s a frustrating state of HTML that the drop and drag currently in. Nothing is ever 100% functional and many features are just cross-browser broken. This is a good example of that.

Here is my answer formatted better:

http://stackoverflow.com/questions/26499462/get-dropped-elements-id-instead-of-drop-target-id/41274540#41274540

Shoutcast. Server.

Posted on Updated on

Ok, so while I’m on the topic of using Winamp on macs and so on, I thought it was time to bust out where to find the instructions of where to download the current ShoutCast DNAS server from.

The name is kind of appropriate, as I’ll be running it from d’NAS… 😉

At the moment Nullsoft seem to be slowly undergoing changes (again) and thus the software is being developed.

However.

They do have the legacy tools still available on their servers. You just have to search for them.

sc_serv2_linux-latest.tar.gz
sc_serv2_linux_x64-latest.tar.gz
sc_serv2_win32-latest.exe
sc_serv2_win64-latest.exe
shoutcast-dsp-2-3-5-windows.exe

There are plenty on how to instructions. The problem is trying to find the software in the first place.

Oh, there is also some other software called ShoutCastGUI, but I found this software frustrating, as it wanted to post my playlist and radio station to an online location somewhere, and had the most annoying NAG screens ever.

So while ShoutCastGUI did a great job at what it was designed to do, it was also not the tool for me. I just wanted to be able to set up a stream inside my house and not publish it. The config was easy, but there was too much other stuff… like a chat server? Why that’s there, I don’t know. But it is what it is. Hat’s off to the devs though, it’s a good program. I just don’t need all the extra stuff.

So for a bare-bones setup, just stick with the above links I’ve listed.