Jump to Navigation

Feed aggregator

You can't hide.

Dick Turpin - 8 hours 28 min ago
Part of the training I give relates to calling people for data cleansing purposes. You get to speak to some very strange people at businesses with even stranger ideas about discussing their company! Today there was a prime example of the silliness of people and how I train my colleagues to overcome their blocking tactics.
Having gone through most of the address details.
Telesales: "And could I just take an email address for Malcolm?"Prospect: "We don't give out email addresses."Telesales: "OK, could I have your companies generic address then?"Prospect: "As I said we do not give out email addresses!"Telesales: "Oh OK, it's not a problem, I'll get the address from your website."Prospect: "What? Wait? What? Oh OK it's.........."
Nothing is secret anymore.

Automated twitter compilation up to 26 July 2015

David Goodwin - Sun, 26/07/2015 - 06:00

Arbitrary tweets made by TheGingerDog up to 26 July 2015

  • RT OH: “your place is nice, I like the 50ft Ethernet cable from your living room to your bed, that’s a nice touch.” 2015/07/25
  • RT “Ban the burqa” they said. “It’s wrong to cover their faces” they said. #EDL brain-dead arseholes in Lincoln today

    2015/07/25

  • Seemingly wasted most of the morning trying to get kdump-tools / kdump to work on a Debian Jessie AWS ec2 hvm instance (r3). #didNotWork 2015/07/24
  • RT Universal Pictures finds pirate copy of Jurassic World on 127.0.0.1 – and sends DMCA takedown www.theregister.co.uk/2015/07/23/movie_studio_finds_pirated_jurassic_world_on_localhost/

    2015/07/23

  • RT What happened when we decided to hire new staff anonymously: https://blog.bytemark.co.uk/2015/07/23/anonymous-recruitment-we-loved-it

    2015/07/23

  • RT For a Few Bytes More…

    www.commitstrip.com/2015/07/23/for-a-few-bytes-more/

    2015/07/23

  • RT The hitman of the future will be a hacker. Forget financial gain. Digital killing and disruption will be the next big thing. 2015/07/22
  • Wrote as many LOC as I deleted today. Not all in the same language though. 2015/07/22
  • Dry fingers make for a very poor touch screen experience. 2015/07/21
  • I have an all-you-can-eat Google music subscription. Yet Google Play keeps trying to sell me albums/songs. Just let me listen to them ffs. 2015/07/21
  • RT Why are the accelerator peddle, steering & brakes even connected to the internet? Was this ever a good idea? www.wired.com/2015/07/hackers-remotely-kill-jeep-highway/ 2015/07/21
  • RT sideways people, sideways!

    2015/07/20

  • RT Don’t get ill in America.

    2015/07/21

  • Headline: “Greece repays 2bn arrears to IMF.”. So they’ve refinanced and changed to a new credit card with an interest free holiday ? 2015/07/20
  • The @theresamaybot seems quite busy. I hope @gchq is more discreet …. 2015/07/20
  • RT 30K MongoDB instances are accessible from the Internet without authentication, containing 595Tb of data #infosec https://blog.shodan.io/its-the-data-stupid/ 2015/07/19
  • RT As I made my way down the ladder I partially closed the hatch. Being careful not to lock it on my way out. #Apollo11

    2015/07/20

  • RT Wanted: Dev with safe hands who likes a challenge and wants to work from anywhere https://siftware.com/needs-you/ Talk to me at #phpsc 2015/07/17
  • RT What a Pull Request looked like in 1988.

    2015/07/17

  • RT sorting algorithm (in one gif) www.sorting-algorithms.com/

    2015/06/07

  • RT This is a serious indictment. How long can it carry on?

    2015/07/19

Symfony2 pagination

Iain Cuthbertson - Wed, 06/02/2013 - 14:42

Using Symfony2, DQL and knplabs/knp-paginator-bundle – how to get around “Cannot count query which selects two FROM components, cannot make distinction”

Chroot SFTP home dir

Iain Cuthbertson - Tue, 05/02/2013 - 15:21

Example user ‘iain’

sudo mkdir -p /chroot/iain/home/iain
sudo useradd -M -d /home/iain iain
sudo passwd iain
sudo chwon iain: /chroot/iain/home/iain

sudo nano -w /etc/ssh/sshd_config
# At the end of the file, add:

Match User paypoint
    ChrootDirectory /chroot/iain
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand internal-sftp

sudo /etc/init.d/ssh restart

Making an entity repository container aware in Symfony2.1

Iain Cuthbertson - Mon, 04/02/2013 - 08:49

I had a need to add ACL rules to entities at the repository level.

My biggest struggle was getting dependancy injection working.

This is what I finally came up with after a fresh mind and an instant coffee:

Adding extra fields to FOSUserBundle / SonataUserBundle

Iain Cuthbertson - Wed, 03/10/2012 - 09:28

Sadly, this isn’t really documented (at time of writing).

Adding new protected variables to your User.php entity will not actually create database entries when you try to do a doctrine:schema:update.

While one still needs to have the protected variables in this entity class, along with getters and setters, the actual creation work is within UserBundle/Resources/config/doctrine/User.orm.xml

Here is an example for adding a foreign key:

<?xml version="1.0" encoding="UTF-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity name="Application\Sonata\UserBundle\Entity\User" table="fos_user_user"> <id name="id" column="id" type="integer"> <generator strategy="AUTO" /> </id> <many-to-one field="client" target-entity="Myvendor\MyBundle\Entity\Client" orphan-removal=""> <join-columns> <join-column name="client_id" referenced-column-name="id" nullable="1"/> </join-columns> </many-to-one> </entity> </doctrine-mapping>

Ubuntu 12.04 LTS on Bytemark VM

Iain Cuthbertson - Tue, 26/06/2012 - 12:05

If, like me, you can’t wait for Ubuntu 12.04.1 to be released, you can force an upgrade of your favourite OS OS.

sudo apt-get update; sudo do-release-upgrade -d

If you are going from the previous LTS 10.04, then the -d is important. Otherwise there would be no upgrade to offer.

The upgrade process should go smoothly enough. Except for when it comes to the kernel.

Bytemark VM’s make use of kernels that sit outside of the VM itself.

I didn’t realise this until I tried to fix syslog doing this:

Jun 26 10:30:01 banana kernel: Cannot read proc file system: 1 - Operation not permitted. Jun 26 10:31:02 banana kernel: last message repeated 1745888 times Jun 26 10:32:03 banana kernel: last message repeated 1722636 times Jun 26 10:33:04 banana kernel: last message repeated 1621724 times Jun 26 10:34:05 banana kernel: last message repeated 1761707 times

Even if you update grub, it’ll be ignored. Instead, follow the instructions here: http://www.bytemark.co.uk/support/technical_documents/kernelchange?tags=VirtualMachine

At the time of writing, I chose 3.2.0-kvm-i386-20110111 as it’s fairly close to the kernel being used by other Ubuntu 12.04 machines I have.

Your mileage may vary, but I hope this helps somebody else with the same trouble.

Updating a WordPress database with new domain details

Iain Cuthbertson - Sun, 24/06/2012 - 18:31

Further to my original quick db update queries, I found the need for a more in-depth approach.

A WordPress site my father works on has weekly backups, but he wanted to see that they actually worked.
To do so, I set up a subdomain vhost on my bytemark server and set about getting the back to work with it.

One of the most annoying/lazy/strange things about WordPress is that it uses serialised arrays within database fields. This makes a simple search and replace fail if you need to do anything more than update the two fields here.

This script works for the database set-up for my father. It may require further tweaks if additional plugins store absolute paths or URLs.

It also could do with a heavy dose of refactoring, but it works for my needs at this point in time

<?php $argv = (isset($argv)) ? $argv : array(1 => 'wp3/wp-config.php'); if (!isset($argv[1])) { die("Please tell me where wp-config.php is\n"); } $oldURL = 'http://oldDomainName.com'; $newURL = 'http://backup.of.my.wordpress.site.com'; $oldPath = '/home/chem9598/public_html/'; $newPath = '/var/www/backup_wordpres_site/codebase/htdocs/'; $configFile = $argv[1]; include_once($configFile); $db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); /* * 1.1) wp_options - simple options */ echo "<br />1.1) wp_options - simple options: "; $updateOptionsSql = "UPDATE wp_options SET option_value = REPLACE(option_value, '" . $oldURL . "', '" . $newURL . "') WHERE option_name IN ('siteurl', 'home');"; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "<br />"; else echo mysql_affected_rows ($db) . " rows affected<br />"; /* * 1.2) wp_options - serialised array options */ echo "<br />1.2) wp_options - serialised array options: "; $selectOptionsSql = 'SELECT * FROM wp_options WHERE option_value LIKE "%' . $oldURL . '%"'; $selectOptionsRes = mysql_query($selectOptionsSql, $db); if (!$selectOptionsRes) echo mysql_error($db) . "<br />"; $options = array(); while($selectOptionsRes && $row = mysql_fetch_assoc($selectOptionsRes)) { $options[] = $row; } foreach ($options as $option) { if (substr($option['option_value'], 0, 2) == 'a:') { $optionValue = unserialize($option['option_value']); updateArray($optionValue, $oldURL, $newURL); $option['option_value'] = serialize($optionValue); $updateOptionsSql = "UPDATE wp_options SET option_value = '" . mysql_escape_string($option['option_value']) . "' WHERE option_id = " . $option['option_id']; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "<br />"; else echo "."; } } echo "<br />"; /* * 1.3) wp_options - file path */ echo "<br />1.3) wp_options - file path: "; $selectOptionsSql = 'SELECT * FROM wp_options WHERE option_value LIKE "%' . $oldPath . '%"'; $selectOptionsRes = mysql_query($selectOptionsSql, $db); if (!$selectOptionsRes) echo mysql_error($db) . "<br />"; $options = array(); while($selectOptionsRes && $row = mysql_fetch_assoc($selectOptionsRes)) { $options[] = $row; } foreach ($options as $option) { if (substr($option['option_value'], 0, 2) == 'a:') { $optionValue = unserialize($option['option_value']); updateArray($optionValue, $oldPath, $newPath); $option['option_value'] = serialize($optionValue); $updateOptionsSql = "UPDATE wp_options SET option_value = '" . mysql_escape_string($option['option_value']) . "' WHERE option_id = " . $option['option_id']; $updateOptionsRes = mysql_query($updateOptionsSql, $db); if (!$updateOptionsRes) echo mysql_error($db) . "<br />"; else echo "."; } } echo "<br />"; /* * 2.1) wp_posts - guid */ echo "<br />2.1) wp_posts - guid: "; $updatePostsSql = "UPDATE wp_posts SET guid = REPLACE(guid, '" . $oldURL . "', '" . $newURL . "');"; $updatePostsRes = mysql_query($updatePostsSql, $db); if (!$updatePostsRes) echo mysql_error($db) . "<br />"; else echo mysql_affected_rows ($db) . " rows affected<br />"; /* * 2.2) wp_posts - post_content */ echo "<br />2.2) wp_posts - post_content: "; $updatePostsSql = "UPDATE wp_posts SET post_content = REPLACE(post_content, '" . $oldURL . "', '" . $newURL . "');"; $updatePostsRes = mysql_query($updatePostsSql, $db); if (!$updatePostsRes) echo mysql_error($db) . "<br />"; else echo mysql_affected_rows ($db) . " rows affected<br />"; function debug($var) { echo "<pre>"; print_r($var); echo "</pre>"; } function updateArray(&$array, $find, $replace) { foreach ($array as $key => &$value) { if (is_array($value)) { updateArray($value, $find, $replace); } else { $array[$key] = str_replace($find, $replace, $value); } } }

PPTP tunnels and if-up.d

Iain Cuthbertson - Thu, 29/03/2012 - 17:43

Current project requires a couple of VPN tunnels to be set up. An IPsec and a PPTP.
The IPsec will wait for another day, the PPTP is set up and ready to go.
One thing that wasn’t quite right with the tunnel though, is the static route created by PPTP missed out a large chunk of the server’s network.

Starting the tunnel sets up the routing rule of 192.168.100.111 to be sent to the tunnel.

This meant that if I wanted to get to 100.10, it wasn’t being sent.

The way around this was to add a new route: route add -host 192.168.100.10 dev ppp0

Works great from the CLI, nothing happens when added to /etc/network/interfaces or /etc/network/if-up.d/foobar.

Found out (trial and error) that it was trying to add the route as soon as the tunnel was created. This doesn’t work as the tunnel takes a few seconds to wake up.

Work around was to add a ‘sleep 5′ to /etc/network/if-up.d/foobar before the route command line.

Creating race conditions isn’t nice, but it works

GPL v2.0 Fail

Adam Sweet - Wed, 14/10/2009 - 18:08

I was amused

Dealing With BT

Adam Sweet - Tue, 14/07/2009 - 16:54

I know I’ve posted about my ADSL problems in the past. Although I haven’t mentioned them since then, they have been lurking all the time and frequently re-appear, meaning the Internet is either painfully slow or unusable for days, even weeks. My normal ADSL speed is something around 4.5 to 6.5 Mb/s, I live about 1.5 miles from my exchange. That speed is not so bad, it’s the dropouts and the serious speed drops which are annoying, somewhere between 16Kb/s and 1.5Mb/s which made the Internet as it is today, full of flash and graphical adverts, pretty painful and almost unusable for geek purposes (ie downloading Linux isos, or updating machines, or installing an OS over a network). At the worst times, I just can’t connect for hours. Though that doesn’t happen that often, it did happen a couple of times at the weekend.

I think I’ve reported this to my ISP perhaps 5 or 6 times, possibly more. At one stage, my employer paid for a business phone line to be installed in my house with a business ADSL connection over it. When the engineer came, I explained the reasons why we were having this extra line and so, as the cable for the new line had two sets of wires in it, he replaced the cable into the house and ran both lines over the new cable. I got a consistent 7.5Mb/s with the same equipment for over a year until leaving my employer meant losing my business line. That’s an average of 2Mb/s faster than the good speed on my residential line.

After losing the business line, I went back to my old ISP (free activation, you see, the old connection had been ceased). And I’ve been having the same recurring problems ever since. I’ve tried 3 routers, 2 Linksys and a BT Business Hub, 4 or 5 microfilters, I’ve removed all of the extension cables from the house long ago and now it’s my ADSL router on a 1m cable and a single wired phone in a microfilter plugged into the BT master socket. I’ve already checked and I don’t have a bell wire, which is known to add noise to a line and is only of use to old phones which actually have a bell in them. BT will sell you a ‘noise reducing face-plate’, which simply disconnects the bell wire for around 10 GBP.

So anyway, last time I was having real problems was around 4 or 5 months ago, I went through the usual ISP support/BT fault/submitting speed tests routine and although I was able to demonstrate the appalling line speed, I ultimately came up empty handed. The only remaining option was to have BT send an engineer to perform tests at my house, with the risk of being charged 150 GBP if they found nothing wrong, but since I know my line is noisy, I can hear it pop and crackle and scratch with just a phone plugged in, no DSL equipment, I was pretty confident. My man turned up, and he was an incredibly nice guy, but couldn’t find any problems. As I explained the now ceased business line didn’t have any of the problems with the same equipment that my residential line had, he simply went to the exchange and switched the cables over, probably in no officially recorded way, meaning that my residential line was now running over the cables which served the business line. I led a happy life from then on.

That was until about 2 weeks ago when I came home to find a parking fine, a card telling me to submit a gas meter reading or get an estimated bill and some unrelated alarming news which I had to share with my parents. As freephone numbers aren’t free from a mobile phone, I picked up my otherwise unused land-line to call the parking and gas people. I never use my landline for anything other than calling numbers which cost more from a mobile and for receiving calls from people who don’t have mobile phone contracts (ie my mother), everybody else uses my mobile number. My landline had no dial tone so I reported a fault with BT. I got a call a day or so afterwards to tell me that they had done some tests from outside of my property and have fixed the fault. I got home and still had no dial-tone, so I called the engineer back, I explained that I had 2 lines in my house and that an engineer had previously switched the wires at the exchange as I’d had so many problems, he said this probably explained the hassle they had finding the fault and asked me to try the other line, I did and I had a dial-tone, so I was back on the old residential line and my ADSL problems have returned. At this point, I’ve had to disconnect my telephone so I’m able to use the Internet. I have the same problems with 3 different phones and 3 different routers ad nauseum.

After the issues became pretty acute over the weekend, I called BT yesterday morning to discuss the issue with them. The wiring outside my house, from the telegraph pole to the box at the end of the road and from there on to the exchange is almost certainly pretty old, probably anywhere between 20 and 50 years old, I think my house was built in the 1920’s. Since the cable from my house to the pole and the master socket had been replaced about 18 months ago and my equipment has no problems on the other line, I’m pretty sure there’s something wrong with the cabling between the pole and the exchange for my residential line. As I said, with just a phone plugged in, my line is really noisy, at bad times, I can barely hear the person on the other end.

I wanted to explain the issue to them and have them conclude to either do something about the cabling, put somebody with some technical understanding on the case to diagnose the cause of the problems or otherwise just decide that they would solve the problem by moving my line officially from the residential line to what was my business line.

The person who answered put me through to customer services in India. I personally have no problem with Indian call centre workers, but I was relieved to be put through to support in the UK as I find Indian call centres to have a lot of background noise, making the person on the other end hard to hear and the accents difficult to understand. The next person I spoke to refused repeatedly to allow me to explain the issue and said that he couldn’t understand what my issue had to do with my phone line. At least twice I asked him if he would stop interrupting me and allow me to explain the issue, when he didn’t I explained that I was getting pretty annoyed with him and the fourth time I put the phone down. He called back twice, the first time, I ignored it because I was still simmering, the second I answered it as I’d calmed down a little, I realised that he would keep calling and that I wouldn’t get anywhere without speaking to him. He said that he was sorry but we seem to have gotten cut off for some reason, I bluntly told him that I had put the phone down on him because he kept interrupting me. No doubt I now have a ‘rude or difficult customer’ mark on my customer records.

After allowing me to cut to the chase and explain that I can’t use my phone because it makes the Internet go off and I need the Internet more than the phone, he put me through to another support department. I briefly explained the problem and given my problems describing the nature of the issue with the last person, I said that ultimately I would like to move my residential line to use the wiring which served the business line I once had. The lady explained that it would cost 122.50 GBP. Why? The wiring is already here. I already know that from a technical point of view all they need to do is switch the wires at the exchange, they just have to record it in their systems too. I think at this point, I used the word ridiculous and asked whether it was a joke about 3 times each. The lady explained that it was a standard charge. I asked who it was standard to, I was pretty sure that it was standard only to BT, which makes it not standard at all, but proprietary to BT. She didn’t answer, she just asked whether I wanted to go ahead, I said no. She said that for ADSL problems I would have to speak to my ISP, since my ISP wasn’t BT. I neglected to point that out that I had repeatedly done so as I was still pretty much flabbergasted.

The problem is you see, for the benefit of people from outside of the UK, that in the old days, BT built and ran the telephone network and were owned by the UK government. In the 1980’s, the ruling Conservative party government, headed by Prime Minister Margaret Thatcher decided to modernise Britain by privatising most of the government run utilities, like the gas, electric and phone companies, to increase competition and thus performance and no doubt to wrestle political power away from the workers’ unions which generally funded and proivided the backbone of support for the main opposition party, Labour. Despite privatisation, BT still own the telecommunications network almost exclusively, a few other companies set up their own networks, but none of them took off. Mercury Communications was the most notable but was eventually absorbed into it’s parent company, Cable and Wireless. In the 1990’s a separate telecoms industry developed, using cable technology, headed primarily by Telewest an NTL which has since bought Cable and Wireless. BT still had an almost complete stranglehold on the traditional PSTN/copper wire telephone network and dial-up Internet connections. Though you can get dial-up and more recently ADSL from any number of companies, your supplier would still be supplying you with a connection from BT Wholesale since BT own all of the exchanges. Your alternative would be to use cable from whichever supplier covered your area. A few years ago, Telewest, with it’s consumer broadband division since re-branded as Blueyonder, bought NTL and the combined company was then bought up by Virgin to become Virgin Media.

Still with me? Ultimately that means BT still own all of the copper telephone network and you either get ADSL from them via a reseller or you get cable. Since I live just outside the cable area, literally by about a mile or 2, cable is no option for me and 3G Internet is still extortionately expensive for such an unsuitably small bandwidth allowance which I could blow in a busy evening, I’m stuck with a BT phone line and an ADSL connection from BT Wholesale. In any case, I’m in a 3G dead spot. The problem with BT is that they are a telephone company and their ‘bailiwick’, to quote an American phrase, is the phone network, they were caught completely unaware by the explosion of the Internet and then broadband, even today, they are still catching up. The long vaunted BT 21CN (21st Century Network), which will bring fibre to the home, is still about 18 months away from being enabled in my area and 21CN doesn’t support IPv6 (yet). So long as your phone works, they don’t care. The Internet is a secondary service. If the Internet doesn’t work, they don’t care unless your phone doesn’t work either. For Internet problems, you have to go to your ISP, who have to go to BT.

A few years ago Ofcom, the UK communications watchdog, nailed BT to the cross and told them to allow other companys to access the telephone exchanges to install their own equipment. The result is what is known as Local Loop Unbundling or LLU. LLU providers are generally quicker to market with newer ADSL technologies than BT Wholesale, consequently LLU providers have been doing 24 Mb ADSL 2+ for a couple of years while I think BT are only just rolling it out. Sadly my exchange is supplied by only 2 LLU providers, none of which do static IP addresses, which as an IT professional I need (I have firewall rules and host servers at home and so on). In any case, my ISP offered to upgrade me to a 24Mb service and then told me my existing line wouldn’t support it, though my former business line would, so officially, I can’t use 24 Mb, unbundled or not.

So, to boil all of this down:

  • On my existing line, my phone and ADSL connection are not usable at the same time.
  • BT won’t fix the problem because they won’t investigate it any further than they already have and my phone line is capable of making phone calls, which means their network works in their eyes. The Internet is unimportant and they’re not going to replace the stretch of cabling between my telegraph pole and the box at the end of the road or my exchange, just for me.
  • My ADSL provider can’t fix the problem since it just gets forwarded to BT.
  • Since BT don’t care, I have to diagnose the problems myself.
  • I can’t get cable.
  • 3G is too expensive, the bandwidth limit is too low to make it an option (around £30 for 5 GB per month) and I live in a 3G dead spot.

This leaves me with 4 choices:

  1. Pay 122.5 GBP  to BT to switch the phone lines over, probably pay my ISP for the migration too.
  2. Get rid of my BT line and try to use 3G instead.
  3. Pay thousands to get a leased line.
  4. Move house.

Not too much to choose from there since 2, 3 and 4 are completely out of the question. I recall reading somewhere else, that since the rollout of ADSL, ordinary people have had to become experts in telecommunications and PPP protocols just to be able to argue with their ISP and BT about their service problems. Never been more true and I’m technically minded. No doubt, housewives across the land with useless ADSL connections are just getting ushered quietly away and told that it’s not BT’s fault.

BT are slowly moving towards replacing parts the existing copper network with ‘fibre to the home’, or at least to the box on the end of the street, something which should have been done 5 years ago, top cable speeds are currently double the ADSL 2+ top speeds and maybe 8 or 9 times that of the fastest ADSL Max product which are notoriously advertised at up to a theoretical 8Mb, which as we know, nobody can ever get. Virgin Media are now trialling 200 Mb/s cable. It’s not all rosy on cable though, Virgin Media’s support are widely reputed to be dreadful and their network management techniques are equally questionable.

My apologies for making you sit through all of this boring drivel, I just need somebody to rant at, almost as much as I need somebody at BT to help solve the issue. I think another call to my ISP and to BT is in order.

UPDATE 15/07/2009: It turns out that when you cancel a telephone line with BT, for a residential line they ‘close’ the line, but leave the equipment connected at the exchange. For a business line, they ‘cease’ it and disconnect any equipment at the exchange. The cost of reconnecting a former business line is therefore the same as installing a new telephone line, which means I don’t save money by simply asking for a new 3rd telephone line altogether.

My existing ISP charge £46 for a migration, though they would consider waiving it should I agree to minimum contract period.

Subscribe to Wolverhampton Linux User Group aggregator


Main menu 2

by Dr. Radut