Elastic Beanstalk npm install error EACCES: permission denied, mkdir ‘/home/webapp’

Ran into an error while deploying to an AWS Elastic Beanstalk instance set up for Rails + Node + Webpack.

Full error during npm install:

npm install
npm ERR! Linux 4.4.23-31.54.amzn1.x86_64
npm ERR! argv "/opt/elasticbeanstalk/support/node-install/node-v4.6.0-linux-x64/bin/node" "/usr/bin/npm" "install"
npm ERR! node v4.6.0
npm ERR! npm  v2.15.9
npm ERR! path /home/webapp
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall mkdir

npm ERR! Error: EACCES: permission denied, mkdir '/home/webapp'
npm ERR!     at Error (native)
npm ERR!  { [Error: EACCES: permission denied, mkdir '/home/webapp']
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'mkdir',
npm ERR!   path: '/home/webapp',
npm ERR!   parent: 'testing-app' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

After some Googling, this Stack Overflow thread gave me some clues: Deploying a Rails / Ember app on AWS Elastic Beanstalk

The /home/webapp directory needed to be created during deploy. This was accomplished using a .ebextensions config with a commands stanza. Docs on commands here

The final commands I used are as follows:

commands:
  01_mkdir_webapp_dir:
    command: mkdir /home/webapp
    ignoreErrors: true
  02_chown_webapp_dir:
    command: chown webapp:webapp /home/webapp
    ignoreErrors: true
  03_chmod_webapp_dir:
    command: chmod 700 /home/webapp
    ignoreErrors: true

Ubuntu server 12.0.4 SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Ran into some trouble with Ubuntu 12.0.4 and an “SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure” error while accessing the Zoho Docs API through Python. Apparently Zoho’s API endpoint enforces a certain SSL version. The full python error was:

SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

After ruling out python and openssl, the fix was to simply update to Ubuntu 12.0.4.1 through apt:

apt-get update
apt-get upgrade

And for the hell of it did a distribution upgrade:

apt-get dist-upgrade

django-simple-redis-admin: Manage redis within the django admin

It’s been a while since I talked about anything i’ve been coding. A few months ago I released Django Simple Redis Admin, which allows you to manage redis cache keys within the Django admin. Something that annoys me with other django admin packages is the requirement to add database tables for their packages. django-simple-redis-admin gets around this by making a django model on the fly. No need for tables, just plug and play. Hopefully in the future i’ll be adding some filters and speeding things up. Check out django-simple-redis-admin on my GitHub page.

python-cloudcracker: a class to interface with the CloudCracker API

So I released a quick python class to interface with the CloudCracker API. CloudCracker is a new online password cracking service. Upload a pcap file, pay via BitCoin or Stripe, and they will crack the password for you. Pretty cool. Check out CloudCracker at cloudcracker.com and check out python-cloudcracker on GitHub.

Ultramemcache: python-ultramemcached and django-ultramemached-cache

A few months ago I came across a package on GitHub called Ultramemcache, which was described as “Ultra fast memcache client written in highly optimized C++ with Python bindings.”

Using Ulramemcache, I modified the common python-memcached library to use Ultramemcache, making sure it could be used as a drop in replacement. Check out python-ultramemcached on my GitHub page.

I also put together a django cache backend using Ultramemcache. This currently does not require my python-ultramemcached library. Check out django-ultramemcached-cache on my GitHub page.

Django runserver and gevent; NotImplementedError: gevent is only usable from a single thread

Hey. So I ran into a problem when using Django runserver and Requests for Python. Specifically, when running runserver, I came across the error:

NotImplementedError: gevent is only usable from a single thread

To fix this, you need to run the gevent monkey patch in your projects manage.py.

Add the following lines in the __main__ of your manage.py

from gevent import monkey
monkey.patch_all()

Your main will look as follows:

if __name__ == "__main__":
    import gevent
    from gevent import monkey
    monkey.patch_all()
    execute_manager(settings)

phpFlickr 3.1 cache unserialize error

I came across a problem today with phpFlickr 3.1 and the way it handles its database caching. I believe it has to do with commas in the serialized data that is being inserted into the cache table. After grabbing the cache result php gave me this error in the phpFlickr library:

Notice: unserialize(): Error at offset ... phpFlickr.php

To fix this error you need to base64 encode and decode the data going into the database.

in phpFlickr modify line 144 to decode the response:

return base64_decode($result['response']);

line 177 on cache row update:

$sql = "UPDATE " . $this->cache_table . " SET response = '" . str_replace("'", "''", base64_encode($response)) . "', expiration = '" . strftime("%Y-%m-%d %H:%M:%S") . "' WHERE request = '" . $reqhash . "'";

line 180 on cache row insert:

$sql = "INSERT INTO " . $this->cache_table . " (request, response, expiration) VALUES ('$reqhash', '" . str_replace("'", "''", base64_encode($response)) . "', '" . strftime("%Y-%m-%d %H:%M:%S") . "')";

Thanks to David Walsh for his php serialize tips:
http://davidwalsh.name/php-serialize-unserialize-issues

Django AuthenticationForm and non field errors

Here’s a quick tip for the built in Django AuthenticationForm in django.contrib.auth.forms: use the non_field_errors method when trying to display the incorrect user/pass error. The error is raised in the general clean method and is not bound to any field, so using form.errors doesn’t give you the error message itself.

{{ form.non_field_errors }}

Django forms: Adding a blank option to a required choice field

Recently I came across a problem where I had a django form choicefield that needed to be required, but also needed a blank choice in case the user didn’t see the field and incorrectly submitted the first value. I saw a stack overflow post recommending to make a clean method to check that the first choice isn’t selected. That post is here:

http://stackoverflow.com/questions/5289491/blank-option-in-required-choicefield

… but a better way to do this is to simply leave the value of the blank choice as an empty string, which will invalidate the form without any extra clean method, like below:


CHOICES_WITH_BLANK = (
    ('', '--------'),
    ('1', 'choice one'),
    ('2', 'choice two'),
)

class ChoiceForm(forms.Form):
     choice_field = forms.ChoiceField(choices=CHOICES_WITH_BLANK)