Showing posts with label ubuntu. Show all posts
Showing posts with label ubuntu. Show all posts

Sunday, June 18, 2017

Drupal 7 and upgrading Media module to 2.x

For a few years now I've been hosting and maintaining a Drupal 7 installation for a non-profit club. I chose Drupal because I needed to provide a website that a non-technical person could easily publish content on.

I've written this post in the hope that it might just help someone and also to vent some frustration over the house-of-cards that is Drupal.

Why Drupal?

I did not want to run Wordpress because at the time, Wordpress had a sorry security and upgrade reputation. I'll note now that Wordpress has slowly rehabilitated that reputation, but still not to the point that I'd be willing to look after a Wordpress site myself.

Drupal is no walk in the park. In fact, I've been constantly annoyed by just how difficult maintaining a Drupal installation is. Layers upon layers of modules need to be installed before you have a dynamic and user-friendly website.

Drupal Drawbacks

Upgrading modules is generally easy, but still a chore in particular because I do not personally like the automated upgrade methods. For anyone maintaining many Drupal installations or a popular site where quick adoption of security patches is mandatory I am sure automated updates are a lifesaver.

I'll skip mentioning the scores of transient errors (Drupal love your system memory long time) and tedious frustrations (I cannot for the life of me work out how to get clean URLs working) that one encounters with Drupal in general, because I want to cover off some notes about the Media module and the version change to 2.x.

There was a major security problem discovered in the Media module version 1.x, which required an upgrade to 2.x. The upgrade instructions were so convoluted and the user problems post-upgrade were so frightful that I elected to wait it out and let other people suffer the bugs and pain. Meanwhile, I didn't need to take any action to implement the workaround to the security issue, I already had restricted access for untrusted users:
Prevent anonymous or untrusted users from accessing the media browser through permissions configuration -- 7.x-2.8 release notes
The Drupal cron job pestered me for months about needing to upgrade and it didn't feel good to ignore a necessary security update. I finally found the time to go back and review the upgrade process again and review the potential challenges. This exercise revealed an exemplar of how Drupal support and documentation can go woefully wrong.

Upgrade Documentation

The users and developers bravely struggled through the issues, attempting to document things within the framework of the Drupal website. Meaning that in order to upgrade from 1.x to 2.x and understand all the potential issues before upgrade, I needed to review these pages and hope that I'd discovered all the relevant documentation.
  1. Media
  2. media 7.x-2.8
  3. upgrading from 1.x to 2.x support
  4. Upgrading Media 7.x-1.x to 7.x-2.x
  5. Document Upgrade Path from Media 1.x to Media 2.x/3.x
  6. Comparison between Media 1.x and 2.x
  7. Critical database error after updating to this version
  8. Media + CKEditor + Media CKEditor recipe for setup
  9. File Entity (fieldable files) 
I was lucky in that I didn't have to mess around with the Views or Features modules or rework any fields (see link 4 above). This wasn't entirely luck, in that I've taken the approach with Drupal modules (and pages) to make customisations only when absolutely necessary; stemming from my abject fear of the nightmare scenario the Media upgrade represented.

How I Upgraded from 1.6 to 2.8

Well I hope this helps someone.
  1. Download the module tarball and extract it into the usual modules directory, overwriting the original module files.
  2. Download the File Entity module and extract it into the usual modules directory. File Entity is a new module to install because the functionality used to be a part of Media but has now been removed.
  3. Delete the file_entity directory in the Media module's directory. This is a directory resident from the older 1.x Media install. See link 6 above for more info.
At this point the site was generally working, but I was not able to run the database update mechanism (update.php) because of an issue I had not seen coming. My Drupal runs on an Ubuntu 14.04.5 LTS trusty install and the Database Update mechanism would not run unless the System version was 7.33. The Drupal version I had was 7.26.

Okay, they got me. Insert slow-clap here.

Since my Drupal install appeared to be operating okay, I considered waiting it out until a newer version of the drupal7 package was available and then running the database update. However, while I was doing some other maintenance on the Drupal install, the site came back with an error similar to the critical database error described in link 7 above and it was immediately obvious that the database update needed to be run in order to restore the site.

I considered doing a restore from backup. Eventually, I elected to add another dpkg source and install a newer Drupal version. I selected a Debian source for this although on reflection, taking the Ubuntu xenial source surely would have been the smarter option.

Before you do this yourself, read the rest of this post because I do not recommend mixing Ubuntu and Debian sources.

/etc/apt/sources.list:
deb http://ftp.debian.org/debian jessie-backports main
Then I ran a package update and installed drupal7 from this source. I got a couple of questions from the package installer about the database to use (as if it was a first install), but that was okay.
# apt-get -t jessie-backports install drupal7
I commented out the jessie-backports source and put a hold on the package, because at this stage I'm not clear what I'll do next.
# dpkg --set-selections drupal7 hold
The xenial source is Ubuntu 16.04 and so that is the next upgrade path for me, except that the xenial Drupal version is currently a lower version than the jessie-backports version I now have installed. To be clear, I believe that I should have used the xenial source. Quite a mess I made here, but I can figure this one out later.

Meanwhile, because I'd hosed Drupal earlier, I couldn't access the database update page. I had to put the site into "update_free_access" mode so that I could run the update engine without actually being logged in.

/etc/drupal/7/sites/moff.tech/settings.php:
$update_free_access = TRUE;
Then I could access the update.php page and run the database update, which completed successfully but with some vague messages but the site was up and running. If you do this, remember to set the "free access" back to FALSE after you're done.

Final Notes

The Media upgrade from 1.x to 2.x is a monster and it's likely that everyone who undertakes it will strike their own unique set of issues.

The Media module has been folded into Drupal 8 and so upgrading to 8 might skip this headache.

The File Entity module has not been folded into Drupal 8 so if you need that functionality then you need to install it as a module. Under Drupal 7, you must install File Entity with the upgrade of Media.

Check your Drupal version before you run the Media upgrade. You need System version 7.33 before you can run the database update.

Sunday, February 5, 2017

Roll Your Own Linux Distro for Children


Looking for a kid-friendly linux distro? I recommend you review "In search of a Linux distro for a kindergarten kid" about distros for children. Want to custom build your own? Then you're in the right place.

You better already be handy with Linux, otherwise this is going to be a steep learning curve, but worthwhile.

The summary of "In search of a Linux distro for a kindergarten kid" was that I didn't really like any of the distros on offer. There were a couple of worthy options and it does depend on your expectations. I decided to make my own. This describes how I went about it.

I'll stress again that I wanted a system for a Kindergarten aged child - meaning from 3 until 6 years old. By 5 or 6, a number of these applications will be of little interest.

Steps


The major tasks are:
  1. Install a base system.
  2. Install a GUI and login manager.
  3. Configure the login manager.
  4.  Install the desired applications.
  5. Customise the GUI.

Install Basic System


This whole post is about getting a low-spec system going. This was all set up on an IBM x24 laptop:
root@x24:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 11
model name      : Mobile Intel(R) Pentium(R) III CPU - M  1066MHz
stepping        : 4
microcode       : 0x2
cpu MHz         : 731.500
cache size      : 512 KB

root@x24:~$ cat /proc/meminfo
MemTotal:         628804 kB
MemFree:          396500 kB
MemAvailable:     466904 kB
Yep, 1066MHz CPU on 628MB RAM.


What About Default Ubuntu?


If you've got a machine that can handle the overhead of a default Ubuntu install. You could simply install the Ubuntu desktop and hope that your child doesn't find their way into terriffic trouble. Otherwise, every other day, you're going to need to reinstall Ubuntu.

If you're going the default Ubuntu route, the "junior" group may be problematic. The "junior" group caused all kinds of unexpected headaches. Make sure that user is in related device and sound groups. Edit /etc/group or use:
Debian-Applications->System->Administration->User accounts Admin.


Custom Ubuntu


Just to repeat, my aim was to have a system with a lightweight as possible desktop environment, while still easy to use.

Download and Install the Ubuntu mini distributon. It should be about 50MB in size. The system that you will have installed after that will likely/hopefully not have any GUI. If you encounter an option to install a desktop environment, skip it.

When you set up a user, use the child's first name as the username and password*. It's fun to teach them how to type out their name and then amazing see them do it later without your help.

Installing that won't take long. Soon you'll be rebooting into non-GUI system and will need to login with the user credentials you set during the install.

You'll need to get to the machine remotely of course!
# sudo apt-get install ssh
Find the IP of the machine (run from terminal on machine):
# /sbin/ifconfig

Install GUI and Login Manager


We'll install LXDE, because it's lightweight and works. Use "slim" as the login manager.
apt-get install lxde slim
Life will be easier if you also install these package immediately:
apt-get install aptitude ssh lxsession-logout lxde-common
To get wireless networking right on LXDE, I recommend removing network-manager and installing wicd:
sudo apt-get remove network-manager
sudo apt-get install wicd

Configure Login Manager


Under this setup, I was always needed to specify the session when logging in. That's hopeless if you expect a 3 year old to step through the login process. Set the default session permanently as so:

   # vi /usr/share/xsessions/LXDE.desktop

      Exec=/usr/bin/startlxde

   # vi /etc/slim.conf

      login_cmd           exec /bin/bash -login /etc/X11/Xsession startlxde


Applications


After looking at all the other distros, see also my aforementioned post I determined that these apps were the most suitable as well as being available in the debian repository. Meaning that they could be installed without hacking, compiling or sacrifices to some Diety.

Most of these will install with "apt-get install <name>" but if the package is not found then install something like aptitude to search for similarly named packages. Packages do change names occasionally.
  • tuxpaint
  • tux math
  • tux typing
  • PySyCache
  • Childsplay
  • pySioGame
  • gCompris
  • Potato Guy
  • BamBam* 
  • Numpty Physics **
* to exit BamBam, actually type "quit".
** Numpty Physics is really cool, but hard on the CPU.

There are a number of KDE only apps (bundled into Edubuntu)  that you cannot use on LXDE. I tried, I failed, if they're not listed above, they didn't work for me.

Customise the GUI


Although the earlier steps sound hard, they really aren't and customising the desktop is where you'll spend the majority of your time. It's a matter of personal preference after all.

Customise the desktop simply by right clicking.
  • Clear all icons including "Trash Can". 
  • Add game icons to the desktop by right clicking on the relevant icons in the "Menu".
Add the LXTerminal shell as an icon on the desktop - yeah this is a risk in itself, but life will get really interesting if you lose the taskbar or menus after junior hacks away at your work. 

Tidy up the menu bar. Right click on the bar to add and remove applets and so on. Remove as much as you dare. Removing the menu bar completely is possible, but getting it back is not necessarily easy. If you need to recover your menu or task bar, start by looking here.

You can add the panel item "Keyboard Layout Handler" if you need to be able to switch between keyboard types. Meaning, if you need to switch between German and US keyboard layouts then this is the applet to use. I'm not talking about actual languages.

If you need to change the default keyboard layout then you'll have to edit /etc/default/keyboard. See /usr/share/X11/xkb/symbols/ to review the syntax of the types.

   $ cat /etc/default/keyboard

      # KEYBOARD CONFIGURATION FILE
     
      # Consult the keyboard(5) manual page.
      XKBMODEL="pc105"
      XKBLAYOUT="us"
      XKBVARIANT=""
      XKBOPTIONS=""
      BACKSPACE="guess"


Quick Problem Suggestions


Have no login screen? Switch to the console using ctrl-alt-f1. Then install SSH (see above).

Have problems with sound? Install alsa-base.

The power button (added by default) did not work for me and you may need to fix the logout button on the menu bar by installing lxsession-logout.

Check whether the ACPI packages are installed. Depending on the age of your machine, ACPI might be supported but not work very well. For example on the laptop I had, it stopped the system from powering off at shutdown, so I removed it:
# sudo apt-get install acpi acpid

Finally


Even if the final version is not perfect in your own eyes, your child will love having their own system. Creating the system is a great learning exercise, but fixing it later is even more so. The reward really is in watching kids excitement in interacting with the games and solving puzzles.

Have fun! Any questions or comments, drop me a line.