Aten Design Group: OpenAid 2.0 - A Free, Open Source Website Starter Kit for Nonprofits

Planet Drupal - Mon, 2015-03-02 17:26

For cause-driven organizations, a website is a place to highlight impact, share resources, and build support. While a blog or brochure site can achieve some of these goals, it rarely does it all. Unfortunately, we all too often find organizations confined by the free and low-cost online platforms accessible to them. With that in mind, we’ve built OpenAid. It’s a free and open-source website starter kit developed for nonprofits and grassroots organizations. Its feature set is robust, its architecture flexible, and it can be installed in minutes.

We worked with activists, community organizers, and aid workers to build a platform that serves their organizations’ needs. Here are some of the features we’ve built to allow groups to inspire and connect with others on a scale that truly reflects their impact in the world.

  • Project mapping. Each project or program you add to the site is displayed on dynamic maps, allowing users to see the full scope of your work. Because OpenAid is flexible, you can easily adjust a project to instead be a city or chapter and still take advantage of all of the mapping features.
  • Blog and news. There are subtle but important differences between a News section and a blog, so we decided to build both for ultimate flexibility. Associate authors with your posts to create dynamic profile pages and allow users to track their favorite writer’s work. Reference a project with a post and it will display on a project’s page, creating almost a mini website for that project.
  • Resource library. Share the resources you’ve created with the rest of the world in an easy-to-find way. We’ve added metadata fields such as Resource Type and Topics and provided a filter set and search interface to allow users to quickly discover the tools and materials relevant to them, even if your library has grown to hundreds of documents.
  • Image galleries. Pictures are key to telling your stories and connecting with your supporters. Associate a gallery with one or more projects to highlight events, volunteers, and initiatives specific to that project’s work.
  • Beautiful, responsive design. Design is important and we want your website to look great regardless of device. A color picker allows you to easily adapt OpenAid to reflect your organization’s identity. We’ve also developed it with flexibility in mind so if you add new pages to the site or add fields to a content type, your site will retain that same great look and feel.

You can dig further into OpenAid’s feature set by spinning up a free sandbox site on Pantheon. Or download the distribution at https://drupal.org/project/openaid to install on any server. If you have further questions or would like assistance getting set up with OpenAid, feel free to reach out to me at openaid@atendesigngroup.com.

Categories: FLOSS Project Planets

administration @ Savannah: Savannah https SSL certificates updated

GNU Planet! - Mon, 2015-03-02 17:15

The https SSL certificates for the Savannah web site have been updated.

Categories: FLOSS Project Planets

Shomeya: When Success Starts to Feel like Failure

Planet Drupal - Mon, 2015-03-02 16:55

Last week was awesome, sort of. I hit all the numbers on my guide launch I was hoping for, and then promptly got the stomach flu. After two years (lots of running in circles) of working through this process of launching I did it!

Now it could have just been being sick, but I ended the launch wanting something more. And the reality is this isn't the first time I've been down after a success.

Does that ever happen to you? You get so excited about something and launch it? Then the next day you wonder if you could have done better, or you aren't sure where to go next. It's happened with our clients, we work so hard, we push the code, we launch on time, and then the question of "Now what?" lingers.

Read more
Categories: FLOSS Project Planets

Jonathan Dowland: Debian and Docker

Planet Debian - Mon, 2015-03-02 16:34

I've been playing around with Debian and Docker a little bit. I found Joey Hess' post about Docker trust interesting reading, in particular this advice:

I'd recommend only trusting docker images you build yourself. I have some docker images published somewhere that are built with 100% straight debootstrap with no modifications (...) But I'm not going to link to them, because again, you should only trust docker images you built yourself.

On that advice, I did exactly that. I've pushed the basic scripts I used to build my images to github:jmtd/debian-docker. Suggestions welcome!

However, I am planning to share the images I build, at least for my own convenience, on the Docker repository. I'm hoping to publish some PGP-signed sums somewhere so you could verify the binary images on the Docker registry if you so wish.

The three images I'm currently maintaining are:

  • jmtd/debian:buildd: a sid image, variant buildd, to use as the base for package builds
  • jmtd/debian:wheezy: a minbase wheezy
  • jmtd/debian:wheezy-i386: a minbase wheezy, i386

(note: I haven't pushed them all yet.)

With docker 1.5.x at least, the i386 image works fine on amd64 hosts. I've used it as the basis for running wine and Windows binaries. I might push a wine image if I generalise it enough to be more useful.

The Docker folks recommend using Debian as a base image because it's a small size (approx. 163M for my base image, 85.01M for the semi-official one: See Joey's blog for some of the differences) but with a good set of tools. I wondered whether I could leverage the efforts of the Emdebian project to get an even smaller base image.

Unfortunately, the Emdebian project discontinued their 'Grip' project midway through last year. A basic Emdebian grip install is a fair bit smaller than the equivalent wheezy image, but once you've applied security updates most of the difference is lost. I suspect that some of Emdebian's minimisation techniques would be useful and applicable for shrinking Docker base images.

Categories: FLOSS Project Planets

DrupalCon News: Higher Ed Joins the Summit Lineup

Planet Drupal - Mon, 2015-03-02 16:27

This year in Los Angeles, the Higher Ed Summit will be part of the official DrupalCon program for the first time. Along with the Business and Community Summits, the Higher Ed Summit will meet on Monday, May 11.

Categories: FLOSS Project Planets

Jorge Niedbalski: How to recover juju from a lost ~/.juju (OpenStack Provider)

Planet Python - Mon, 2015-03-02 16:17

If you have accidentally lost the ~/.juju directory or the
host where your juju client runs, then the following
procedure can help you to recover access to your environment.

Note that this document covers the OpenStack provider, but could
apply for others as well.

We are assuming that the nodes that composes your juju
deployment are still alive, specially your bootstrap host.

First, you need to have a new machine, setup a new ssh key ( ssh-keygen -t rsa )
and install juju-core.

Then, you need to find on which nova-compute node is your machine
living on:

$ nova hypervisor-servers juju-$USERNAME-machine-0 +--------------------------------------+-------------------+---------------+---------------------+ | ID | Name | Hypervisor ID | Hypervisor Hostname | +--------------------------------------+-------------------+---------------+---------------------+ | 078f97cf-19e0-440d-aa5c-1234a75a57d3 | instance-000005a2 | 1 | juju-$USERNAME-machine-0 |

Then filter the hypervisor-list with the hypervisor id:

$ nova hypervisor-list | grep 1 +----+---------------------+ | ID | Hypervisor hostname | +----+---------------------+ | 1 | nova-compute-01 |

Then access to your nova-compute-01 machine, and then check if the directory for
instance-000005a2 exists:

$ sudo ls -al /var/lib/nova/instances/078f97cf-19e0-440d-aa5c-1234a75a57d3

Then tell to virsh to stop that instance:

$ sudo virsh shutdown instance-000005a2

Then assuming your are running with local based storage using qcow2 format,
mount the unit as a network-block-device.

$ sudo qemu-nbd -c /dev/nbd0 /var/lib/nova/instances/078f97cf-19e0-440d-aa5c-1234a75a57d3/disk $ sudo mount /dev/nbd0p1 /mnt/instance

Then enable access to your previously created ssh keypair ( assuming you already copied it to the
Vm hypervisor)

$ sudo cat ~/id_rsa.pub >> /mnt/instance/home/ubuntu/.ssh/authorized_keys

Then umount the nbd device, disconnect and start the instance again.

$ sudo umount -l /mnt/instance $ sudo qemu-nbd -d /dev/nbd0 $ sudo virsh start instance-000005a2

At this point, you can access your instance via ssh using your key, connect to your bootstrap
node and run the next steps there.

Then access to your juju's MongoDB and ask a few details about the environment:

$ sudo su $ mongo --ssl -u admin -p $(grep oldpassword /var/lib/juju/agents/machine-0/agent.conf | awk -e '{print $2}') localhost:37017/admin

Once on the database instance, run the following for getting your environment uuid:

juju:PRIMARY> db = db.getSiblingDB('juju') juju juju:PRIMARY> db.environments.find().pretty() { "_id" : "cc503d03-6933-47a7-8a16-4d1094a6593e"

Second step: Then get all the settings information that will be used later for creating a new jenv file:

juju:PRIMARY> db.settings.find({'_id': "e"}).pretty() { "_id" : "e", "access-key" : "", "admin-secret" : "", "agent-version" : "1.20.14", "api-port" : 17070, "apt-http-proxy" : "http://squid.internal:3128", "apt-https-proxy" : "http://squid.internal:3128", "auth-mode" : "userpass", "auth-url" : "http://x.x.x.x/v2.0", "authorized-keys" : "...", "bootstrap-addresses-delay" : 10, "bootstrap-retry-delay" : 5, "bootstrap-timeout" : 600, "ca-cert" : "-----BEGIN CERTIFICATE-----ZNUqHLxIuzsl\nOVO/pj/GIfrQxXEoG6AGLBrQh6SlJkbbcJLtFno=\n-----END CERTIFICATE-----\n", "ca-private-key" : "", "charm-store-auth" : "", "control-bucket" : "1a560626-981a-11e4-a725-d3f43a24220d", "default-series" : "", "development" : false, "disable-network-management" : false, "firewall-mode" : "instance", "image-metadata-url" : "http://10.x.x.x/swift/v1/simplestreams/data/", "image-stream" : "", "logging-config" : "<root>=WARNING;unit=DEBUG", "lxc-clone-aufs" : false, "name" : "username", "network" : "", "password" : "password", "proxy-ssh" : true, "region" : "region", "rsyslog-ca-cert" : "-----BEGIN CERTIFICATE----- +ByOa+sVdAql\nFA7pG8XJxaZPlbWj1ZCE2LjIgV+6N9bTXPb7RArmn3OWaKw=\n-----END CERTIFICATE-----\n", "secret-key" : "", "ssl-hostname-verification" : true, "state-port" : 37017, "syslog-port" : 6514, "tenant-name" : "username", "test-mode" : false, [...] "type" : "openstack", "use-default-secgroup" : true, "use-floating-ip" : false, "username" : "username" }

The only important settings from the above list, are: control-bucket, ca-cert, name and password. Then
grab the following file from the bootstrap node, that contains the public/private CA certificate.

$ ls -lt /var/lib/juju/server.pem

On the new juju-client machine edit ~/.juju/environments.yaml and add a new openstack provider:

recovery: type: openstack control-bucket: CONTROL-BUCKET-UUID admin-secret: password auth-url: http://x.x.x.x:5000/v2.0 region: region username: USERNAME-FROM-MONGODB password: PASSWORD_FROM_MONGODB tenant-name: username use-default-secgroup: true image-stream: "released" apt-http-proxy: http://squid.internal:3128 apt-https-proxy: http://squid.internal:3128 tools-metadata-url: https://streams.canonical.com/juju/tools/ image-metadata-url: http://x.x.x.x/swift/v1/simplestreams/data/

Replace control-bucket, admin-secret, username, password with the values from the mongodb

Then create a new file called ~/.juju/environments/recovery.jenv , with the following contents:

user: admin password: test environ-uuid: ENVIRONMENT_UUID state-servers: - ip-address-of-your-bootstrap-node:17070 server-hostnames: - ip-address-of-your-bootstrap-node:17070 ca-cert: CA_CERT bootstrap-config: access-key: "" admin-secret: TO_BE_DEFINED agent-metadata-url: https://streams.canonical.com/juju/tools/ api-port: 17070 apt-http-proxy: http://squid.internal:3128 apt-https-proxy: http://squid.internal:3128 auth-mode: userpass auth-url: authorized-keys: bootstrap-addresses-delay: 10 bootstrap-retry-delay: 5 bootstrap-timeout: 600 ca-cert: SECOND_CA_CERT ca-private-key: SECOND_CA_CERT_PRIVATE charm-store-auth: "" control-bucket: CONTROL_BUCKET default-series: "" development: false disable-network-management: false firewall-mode: instance image-metadata-url: http://x.x.x.x:80/swift/v1/simplestreams/data/ image-stream: released logging-config: <root>=WARNING;unit=DEBUG lxc-clone-aufs: false name: USERNAME network: "" password: PASSWORD prefer-ipv6: false proxy-ssh: true region: region secret-key: "" set-numa-control-policy: false ssl-hostname-verification: true state-port: 37017 syslog-port: 6514 tenant-name: USERNAME test-mode: false tools-metadata-url: https://streams.canonical.com/juju/tools/ type: openstack use-default-secgroup: true use-floating-ip: false username: USERNAME uuid: ENVIRONMENT_UUID

Replace the environ-uuid and uuid with the environment uid, then the first ca-certentry
with the ca-cert specified on the second step. Then the next ca-cert and ca-private-key
with the contents of the file /var/lib/juju/server.pem that you got from the bootstrap node.

Once you are done, you need to regenerate your admin-password with a new one, use the following
Go script to re-generate:

package main import ( "fmt" "os" "github.com/juju/utils" ) func main() () { salt, err := utils.RandomSalt() if err != nil { fmt.Println(err) } fmt.Printf("admin-password:%s - salt:%s\n", utils.UserPasswordHash(os.Args[0], salt), salt) }

Compile and run with:

$ go build password.go $ ./password newpassword admin-password: 98asdnaskd - salt: 9asdasd93asd

Edit your ~/.juju/environment/recovery.jenv and replace the fields admin-secret and password
with the value that you passed to the previous script ( in plain text ).

Once you save your changes, then you need to jump into the mongodb database and update the salt and password:

$ sudo su $ mongo --ssl -u admin -p $(grep oldpassword /var/lib/juju/agents/machine-0/agent.conf | awk -e '{print $2}') localhost:37017/admin

Once on the database instance, update the admin user with your new password and salt.

juju:PRIMARY> db = db.getSiblingDB('juju') juju:PRIMARY> db.users.update({'_id': "admin"}, { $set: { "passwordhash": "NEWPASSWORD", "passwordsalt": "SALT" })

At this point you should be access to switch into your new environment and run a juju status.

$ juju switch recovery $ juju status Accessing via SSH

For accessing via juju ssh you need to copy your new RSA public key into ~/.ssh/authorized_keys for every
juju machine. After doing this, you need to manually modify the database to use your new ssh key

juju:PRIMARY> db.settings.update({'_id': "e"}, { $set: { 'authorized-keys': "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCupSv5dH6LO3qIu4EfBP8OhHO4RwLmgz9twWCgh5Boh/sdasdasdad/9lVottd2ACwVMCsAPxwBJmc/58EIVguuqQlLs9AT0KZu1tYqgqsAhQxOspQTXjbNKgrJNVsOxzi1i34HAoyICGkv3/j2IwRWLBY73e4lk+7U3kea/5vhmoehYDXmkeDpSPrw3btM2QiBIo6eibe6q8fas2/hZcS9R4ykG/6/iM1 ubuntu@your-new-host\n"}})

Once this is done you can access your environment via SSH:

$ juju ssh 0

At this point the recovery is completed.

Categories: FLOSS Project Planets

Zlatan Todorić: Debian priglavci

Planet Debian - Mon, 2015-03-02 15:36

Mom and Debian is an awesome combination. :)

Categories: FLOSS Project Planets

Wouter Verhelst: NBD 3.9

Planet Debian - Mon, 2015-03-02 14:39

I just released NBD 3.9

When generating the changelog, I noticed that 3.8 happened two weeks shy of a year ago, which is far too long. As a result, the new release has many new features:

  • AF_UNIX support
  • New "treefiles" mode, which exports a gazillion of page-sized files; useful for exporting things which are stored on an SSHFS or amazon AWS (trough FUSE) or similar, where every write causes an upload to the backend storage
  • New "cowdir" option, allowing to specify where copy-on-write files are written.
  • Minor changes so that nbd-client can now also be compiled for the Android platform. This required removal of the -swap command line option, which requires the mlockall() system call, unavailable on Android.
  • Protocol update: a reserved bit is used to avoid sending the 124 bytes of useless data at the beginning of the negotiation. The change is implemented so that things will still work with clients not supporting this option, however.
  • gznbd is now built by the same build system, rather than a separate one. Note however that gznbd is still unmaintained; it should be considered a "contrib" feature.
  • "nbd-server -V" will now output the nbd-server version number.
  • Fixed test suite on non-GNU getopt() implementations
  • Various fixes found through Coverity and the clang static analyzer, and lots of other minor things too small to mention here.

Get it at the usual place.

Categories: FLOSS Project Planets

Drupal Association News: Get Ready to Vote: Elections Run 9 March - 20 March

Planet Drupal - Mon, 2015-03-02 13:51
Huh? What are we Electing?

In case you missed it, the Drupal community electing one candidate to serve a two-year term on the Drupal Association Board of Directors. There are two At-Large (community elected) seats on the Board. The other seat is currently held by Matthew Saunders. We've got a really global slate of candidates to consider, and we encourage you to get to know them by listening to the Meet the Candidates sessions and asking them questions on their candidate profile pages. 

Who can vote?

Voting is open to all individuals who have a Drupal.org account by the time nominations opened and who have logged in at least once in the past year. These individuals' accounts will be added to the voters list on association.drupal.org and they will have access to the voting.

To vote, you will rank candidates in order of your preference (1st, 2nd, 3rd, etc.). The results will be calculated using an "instant runoff" method. For an accessible explanation of how instant runoff vote tabulation works, see videos linked in this discussion.

Elections process

Voting will be held from 9 March, 2015 through 20 March, 2015. During this period, you can review and comment on candidate profiles on assoc.drupal.org and engage all candidates through posting to the Drupal Association group. We'll also be scheduling and announcing three phone-in all candidates meetings, where community members and candidates can ask questions and get to know each other.

Have questions? Please contact Drupal Association Executive Director Holly Ross. Many thanks to nedjo for pioneering this process and documenting it so well in the past!

Flickr photo: Kodak Views

Categories: FLOSS Project Planets

DebConf team: Inviting speakers to DebConf15 (Posted by René Mayorga)

Planet Debian - Mon, 2015-03-02 13:00

Last year for the DebConf edition that took place in Portland, we had some invited speakers that helped bring a different point of view to the matters discussed during the conference. This year we would like to do this again.

If you would like to suggest inviting someone that would not regularly attend DebConf, the DebConf Content Team encourages you to do that now. We will stop accepting new suggestions on 10 March 2015.

You can follow the simple procedure described on the Inviting Speakers page in the DebConf’s Wiki

Please keep in mind that we don’t promise to bring to Heidelberg everyone that is suggested. The final list of invited speakers will depend on the speakers’ availability and our limited budget.

Categories: FLOSS Project Planets

Michal &#268;iha&#345;: Gammu 1.35.0

Planet Debian - Mon, 2015-03-02 12:00

Gammu 1.35.0 has been just released. This is just bugfix release to fix some major issues introduced in 1.34.0.

Full list of changes:

  • Fixed encoding of UTF-8 for higher code points.
  • Improved provided udev rules.
  • Fixed possible lock while getting network status in SMSD.
  • Various localization updates.

You can download it from http://wammu.eu/download/.

I will not make any promises for future releases (if there will be any) as the tool is not really in active development.

Filed under: English Gammu Wammu | 0 comments | Flattr this!

Categories: FLOSS Project Planets

Phase2: How to Override Features

Planet Drupal - Mon, 2015-03-02 11:36

The Features module helps address the shortcoming in Drupal 7 of how to manage and deploy site configuration data.  There are times when you need to change a Feature.  The Features Override module can help with this, but sometimes doesn’t solve the problem completely.  In this article I will discuss all the different ways to override your Features and the common problems associated with that.  While this has been an issue for years, it’s become more common recently with the advent of Distributions such as Open Atrium and Panopoly which heavily use Features and which expect the users to upgrade to new versions.  Maintaining your site customizations when upgrading a distribution using Features Override has become a more common need.

The Problem

How do I override configuration from an existing Feature  within my site-specific project?

Solutions Cloning the base module (not recommended)

If you need to make extensive changes you might need to clone the base module and then customize it.  Disable the original module, uninstall it, then enable your site-specific module.

Pros Cons
  1. You have full control over all aspects of the original module.
  2. Keeps the overrides nicely separate in their own modules that can be enabled/disabled/deployed.
  3. The original Features will never be shown “overridden” (because the original is uninstalled!)
  1. Any future bug fixes, improvements, updates to the original module will not be available.
  2. Since future security patches to the original module won’t be available, this might add a security risk to the project or force maintainers to monitor the original module for updates and apply them to the cloned version.
Using settings.php

If you just need to change a variable (from variable_get) you can do this via the $conf[] array in your site settings.php file.  This method is typically used for environment-specific settings, such as databases, search servers, caching settings, etc.  You can also set the $conf[] array within a custom module if you need to deploy the change across all your environment.  Avoid using variable_set() to change the variable since that will update the database directly as mentioned below.

Pros Cons
  1. The original feature containing the variable (via Strongarm) won’t be marked as “overridden”
  1. Only works for Variables (Strongarm Features)
  2. settings.php not typically part of the code repo, so need to ensure it is version controlled some other way.
  3. Sometimes developers forget to check settings.php for variable overrides, making ongoing support tricky.
  4. Best for Environment variables rather than for any generic Drupal variable.
Update the Database directly

You can create an update hook, or other Drupal hook (hook_enable, hook_install) and update the database directly via SQL or other API functions.  For variables you can use variable_set() to save the new value to the database.  This is only recommended as the last resort for configuration not supported by Features Override.

If you must update the database directly, be sure to only do it once and not in a hook such as hook_init that runs with each page load.  Updating the database on each page load can kill the performance of your site.  With variable_set() you can do this by first calling variable_get() and only saving the value if it needs to be changed.

Pros Cons
  1. Sometimes it’s the only way.
  2. Can keep the overrides separate in their own modules
  3. Only applies specific changes and allows future updates to the base Feature to be used.
  1. Reverting the base feature will change the database back to it’s original value, forcing you to re-run whatever SQL is needed to override it. Can be alleviated by Locking the original base Feature to prevent any reverts.
  2. If the original feature is locked, future bug fixes or improvements might not be available.
  3. The original feature will always be marked as “overridden”.
  4. Some configuration is not stored in the DB, such as Views (or other ctools-based components like Panels) that exist purely in code.
Implement an “alter hook” in code

Most configuration has some sort of “alter” hook that allows it to be modified after it is loaded from the database.  For example, Views calls hook_views_default_views_alter(&$data) to allow you to change any part of a view, whether that view comes from the DB or is in code.  You can create a custom module that implements the desired alter hooks and override the data directly.

Pros Cons
  1. Base Feature will not be marked as “overridden”.
  2. Keeps the overrides nicely separate in their own modules that can be enabled/disabled/deployed.
  3. Only applies specific changes and allows future updates to the base Feature to be used.
  1. Not all configuration has the needed hooks.
  2. Each component has a different hook name and different data structure to modify.
Use Features Overrides module

Similar to the above “Implement alter hook” the Features Override module is designed to create the alter hook implementations for you and export those as new Features modules that you can enable, disable, deploy.

Pros Cons
  1. Base Feature will not be marked as “overridden”.
  2. Keeps the overrides nicely separate in their own modules.
  3. Only applies specific changes and allows future updates to the base Feature to be used.
  4. Features Overrides does the work of figuring out which alter hooks can be used and how to override the data.
  5. Provides a UI for inspecting overrides.
  6. Allows an entire component to be altered (e.g. entire view), or just a single change (e.g. just the title of a view)
  7. Works properly with Features. An Override is just another Feature module on the site.
  1. Not all configuration has the needed hooks.
  2. Can be tricky to “override an override”.
Typical Problems Feature is stuck at being “overridden”

The most common difficulty is a base Feature marked as “overridden” that does not go away when the feature is reverted.  ”Overridden” simply means that the value of the configuration stored in the DB is different from what is stored in the exported Feature code file.  Features literally re-generates the feature export internally from the DB and compares the code with what is stored on disk.  Doing a “drush fd featurename” simply shows the code diff between the code stored on disk (shown in red) with the code generated from the current database (shown in green).

To determine if a Feature is overridden, Features actually takes the generated code, sanitizes it, sorts it, executes it, and then does an md5 checksum on it.  If the two checksum values are different, the Feature is marked as “overridden”.  However, the “drush fd featurename” command shows the actual code difference regardless of if it’s marked as “overridden”.

This behavior means that “drush fd” might output code differences that actually don’t cause the feature to be overridden.  For example, if you change the order of dependencies in your module.info file and then run “drush fd” on the feature, you’ll see it display those changes, even though a “drush fl” won’t show the feature as overridden.

This makes it difficult sometimes to debug why a feature is overridden, since not all of the output of “drush fd” is relevant.  You need to look for actual value changes, rather than just re-ordering changes.

Adding a new module

Sometimes, just enabling a new contrib module will cause your Features (especially field features) to be “overridden”.  If the new module adds some new settings, formatters, widgets, etc then these settings will be active in the DB but not reflected in the code.  So the Feature will be shown overridden.  Reverting the feature won’t have any affect because there is no way to remove the new settings from the DB without uninstalling the new module.

These kinds of overrides are annoying, but not actually that important.  They don’t prevent the feature from being reverted when a new version of the base module is released.  They are not caused by any site-specific change that would be lost by a revert.  Typically it’s best to just document these cases and leave them as overridden.  Just be careful to not become complacent and make a site customization in the future to the same feature and then ignore that it’s overridden and lose your changes when you revert.  You should periodically do a “drush fd” on overridden features just to be sure what is shown is still just from the new module you installed.

A disabled module

Similar to the above, but the opposite case.  If you have disabled a module that was used when the original Feature was exported, then the code might have settings for that module that are no longer in your database.  Once again you won’t be able to remove this by reverting.  Again, you can just document these cases.  But make sure you really need to have the module disabled.  Having a module enabled that you are not using is not a big performance impact.  The time saved in long-term maintenance of the site it typically more important than worrying about an extra module.

A bad override

If you have used some of the not-recommended approaches for overriding a base Feature, such as writing directly to the DB, then you will end up with an overridden feature that cannot be reverted.  Or if the Feature is reverted, you might lose the change that was written to the DB and need to reapply it.  Even if the Feature is locked to prevent reverting, it will still be listed as overridden.

Another type of “bad override” is using the wrong kind of alter-hook to try to modify configuration.  If the alter hook is called in a way that makes it look like a DB change to Features, then Features is going to see a difference between the DB and code and mark it as overridden.

Overridden Views and Panels

Some modules, such as Views and Panels have their own “override” functionality.  These “pure” Features can exist purely in code with nothing in the DB.  When you make a UI change to a View, it gets copied from the code into the DB and your change is made to the DB.  The View is then marked as “overrides code” in the Views listing.  A View that came from code can be “reverted” within the Views UI.  This essentially just deletes the version of the view in the DB so that the code takes affect again.

Sometimes you can get a View stored in the DB that still matches the code.  For example, you change a View in the UI (causing it to be copied to the DB), then you edit the View and undo the change.  Now it matches the code again, but the view is still in the DB.  In this case, the View Feature will not be shown as “overridden”, but in the Views listing it will still say “overrides code”.

When changing a pure Feature like a View via code (like in an alter hook), your changes will take affect immediately, or possible after a cache clear.  No revert will be necessary because there is nothing in the DB to update.  However, in the above case where you have changed a view and then changed it back so it’s stored in the DB, changing the code will not affect the View until you revert the Feature to remove the DB copy of the old view.

In general, if you are having issues with Views, Panels, or other ctools-like pure Features, make sure they are not overridden in their respective UIs.  For example, click the Revert option for the View within the Views listing to ensure it’s actually using the View stored in code.

Wrong version of Features

If the code in the Feature was exported using a different version of Features than what is on your site, there might be changes that cause overrides.  Ensure your version of Features matches the version used to generate the export.  This usually only applies to major version numbers and is not normally a problem.  Normally updates to the Features module are made in backwards-compatible ways to prevent this.  But certainly be sure your version of Features on your site is not older than the version that generated the base code.  Always try the latest version of Features to see if it helps.

Nobody should be using the 1.x branch of Features anymore.  There is no reason for this.  All Drupal 7 sites should be on the 2.x branch.

Unsupported Component

As mentioned, not all configuration components support Features Override, or only support it partially.  For example, Panelizer works with Features, but doesn’t work well with Features Override because it still depends on the specific order of items in it’s config array and when the alter-hook generated by Features Override tries to change something, that array order might not be preserved.  Sometimes in this case you can create your own alter-hook implementation that overrides the code properly.

This might also be an opportunity to help improve Features Override or suggest patches to the module in charge of the configuration to better support Features Override.

Living with Overrides

What if you have tried all of this advice and your Feature is still marked as overridden?  And what if this override represents a specific site change that you need to maintain and ensure never gets reverted?  The solution to this is to “lock” your feature component.  Go to the Structure/Features page and select the Feature that is marked as overridden.  Click the small “lock” icon next to the overridden component in the right column.  The component will still be listed as “overridden” but when you revert your Features the locked component will be skipped, ensuring that your customization remains in place.

When locking your Features, try to only lock the specific component rather than locking the entire Feature.  The downside to locking a component is that any changes to that component from a new version of your distribution won’t take affect.  This is similar to the consequences of the “Update the Database directly” option listed above.  However, sometimes this is the only alternative.


Just keep in mind that both Features and Features Override are just implementing hooks (normal hooks for Features, alter-hooks for Features Override) that are exposed by Drupal or contrib module.  If those hooks don’t exist or don’t work properly there isn’t much Features or Features Override can do about it.  Drupal 7 doesn’t have any sort of configuration management in core, so every contrib module does it differently.  ctools-based modules have more of a standard framework, as does entity API.  Features itself tries to add code to handle core components such as Fields, Content Types, etc that don’t have the needed hooks.  But there is often a limit to how much Features can do and just patching stuff into the DB is not usually a good solution.

Don’t “hate” Features or Features Override.  Life was much worse without them.  They are the best solution to solving configuration management problems in Drupal 7.  They have been developed over years of experience.  Try to help improve them before trying to implement your own configuration or override architecture.

Drupal 8

Don’t count on Drupal 8 magically solving all of these issues.  The Configuration Management Initiative (CMI) within Drupal 8 was focused on handling site configuration, but not on “bundling functionality”.  It provides an API, storage mechanism, and framework for deploying configuration.  CMI helps a lot, but there are still issues around around component granularity and overriding configuration.  In Drupal 8, configuration is owned by the site rather than owned by a module.   This will make bundling functionality (ala Features original intent) more difficult.  We will be working on Features for D8 soon, but this is still mostly unknown territory.  For now, take a look at some existing modules such as config_packager and config_devel.

I’ve submitted a session to DrupalCon Los Angeles on Features in Drupal 8.  Add a comment and support!

Categories: FLOSS Project Planets

Drupal core announcements: No Drupal 6 or Drupal 7 core release on Wednesday, March 4

Planet Drupal - Mon, 2015-03-02 10:52

The monthly Drupal core bug fix/feature release window is scheduled for this Wednesday. Unfortunately, due to travel, work, and various other scheduling issues, I was not able to find the time to volunteer to get a Drupal 7 release together for this month. There are also a number of important Drupal 7 patches in development that could probably use another month before they are ready.

Since there hasn't been a bug fix/feature release of Drupal 7 since November, the hope is to get one out in the April release window instead.

Upcoming release windows include:

  • Wednesday, March 18 (security release window)
  • Wednesday, April 1 (bug fix/feature release window)

For more information on Drupal core release windows, see the documentation on release timing and security releases, and the discussion that led to this policy being implemented.

Categories: FLOSS Project Planets

artanis @ Savannah: [ANN] GNU Artanis-0.0.3 released [alpha]

GNU Planet! - Mon, 2015-03-02 09:57

I'm pleased to announce artanis-0.0.3 here.

GNU Artanis is a web application framework(WAF) written in Guile Scheme.

It is designed to support the development of dynamic websites, web
applications, web services and web resources. Artanis provides several
tools for web development: database access, templating frameworks,
session management, URL-remapping for RESTful, page caching, and so on.

GNU Artanis is under GPLv3+ & LGPLv3+ (dual licenses).

GNU Artanis is also the official project of SZDIY community. It's used
to build server side of SZDIY common service. It is offered to GNU
project to make free software better.

Here are the compressed sources:
http://alpha.gnu.org/gnu/artanis//artanis-0.0.3.tar.gz (432KB)
http://alpha.gnu.org/gnu/artanis//artanis-0.0.3.tar.bz2 (352KB)

Here are the GPG detached signatures[*]:

Use a mirror for higher download bandwidth:

Here are the MD5 and SHA1 checksums:

751adf2bee25fd780041142ee4f714f6 artanis-0.0.3.tar.gz
d4aa8076c5af142785037546a378cc61 artanis-0.0.3.tar.bz2
b33cd373f6d969db7e25ce38b4567ea6fb85adc6 artanis-0.0.3.tar.gz
acc5d2fa70f620639aeae9b965cc167562601c3a artanis-0.0.3.tar.bz2

[*] Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact. First, be sure to download both the .sig file
and the corresponding tarball. Then, run a command like this:

gpg --verify artanis-0.0.3.tar.gz.sig

If that command fails because you don't have the required public key,
then run this command to import it:

gpg --keyserver keys.gnupg.net --recv-keys EE78E925

and rerun the 'gpg --verify' command.

This release was bootstrapped with the following tools:
Autoconf 2.69.120-5dcda-dirty


Changes in 0.0.3

  • Notable changes

Fixed several bugs.
Support JSONP.

Categories: FLOSS Project Planets

Drupal Association News: So long, and thanks for all the fish

Planet Drupal - Mon, 2015-03-02 09:52

It is with a happy and heavy heart that I share with you the next step in my journey. After three great years, I am leaving the Drupal Association and packing up my worldly possessions and heading south to Texas, where I will be joining the awesome Austin team of Amazee Labs.

My last three years at the Drupal Association have been incredibly rewarding. I’ve learned so much from each of my (many) DrupalCon teams in Denver, Munich, Sydney, Portland, Prague, Austin, and Amsterdam.

To my Los Angeles and Barcelona teams, I’m sorry to leave you mid-planning, but I’m very excited to see where you take DrupalCon this year without me.

To my DrupalCon globals, thank you for helping grow DrupalCon into what it is today.

To the Portland Drupal community, thank you for being welcoming. Thanks for all the beer and pizza and letting me co-work with you at the Lucky Lab.

To all my volunteers, speakers, sprinters, and trainers, it has been a pleasure to work with you. The community is lucky to have such active, dedicated contributors.

To my colleagues at the Drupal Association, you guys are so weird. Seriously. And I’m going to miss you all dearly.

This may be an end but it’s not THE end. I plan to remain active in the Drupal community, and will be at DrupalCon Los Angeles and DrupalCon Barcelona, as well as MidCamp and possibly LinuxFestNW this year. I hope to see you there!

Stephanie El-Hajj
twitter, drupal.org, irc: stephelhajj
LinkedIn: https://www.linkedin.com/in/stephelhajj

Categories: FLOSS Project Planets

Joe Brockmeier: Presentations and Sharing Slides

Planet Apache - Mon, 2015-03-02 09:46

Warning: Massive generalizations ahead!

It’s pretty common for conference organizers and attendees to ask presenters to provide their slides after the talk to share/post on the event site. While well-meaning, I’m not sure this is an entirely positive trend.

A slide deck that stands alone is often a sign of a poor presentation. If I can read the slides and get a lot out of them without the presentation they accompany, odds are you could have just written a short post that would have conveyed nearly as much information without the need for people to sit through a presentation. (Much less travel a great distance to see it.)

As a corollary to the above, if the presenter is using slides that convey most of the information, then the attendees are probably spending more time watching the slides and/or checking their phones/laptops than actually paying attention to the speaker. Again, what’s the point of sitting through a presentation if you can just read the slides and get most of the information that way?

Yes, you can have meaningful slides that support a presentation and are useful afterwards. For example, if you’re doing a presentation with a lot of data/charts, having those to refer to after the presentation is a good thing. Having code examples, or follow-along examples is a good thing.

I’m writing this, of course, because I received a request for slides for a presentation I gave recently (at SCALE) and was thinking about how often I’m asked for slides before a presentation even begins. (“Will the slides be available?”) In this case, the presentation has some slides that will be useful for attendees — but a lot of the slides are just enough text to spark my memory for the next topic.

Sometimes I’m tempted to chuck presentation-ware altogether and just give a presentation from notes accompanied (when appropriate) with a demo. A live presentation should be about an experience that is more than a person droning on at the front of the room that adds little or no value to the text on a screen. If it’s not, what’s the point?

This is something I’ve been turning over in my head for a while, and I think one of my goals for 2015 is to raise the bar on my own presentations. Suggestions welcome!

Categories: FLOSS Project Planets

Mike Driscoll: PyDev of the Week: Bryan Oakley

Planet Python - Mon, 2015-03-02 08:30

This week we welcome Bryan Oakley as our PyDev of the Week! I’ve met Bryan a few times in various Python-related forums and developer hangouts online. He’s a master at Tkinter and has answered a lot of questions about it (and Python) of StackOverflow and other places. I hope you will enjoy getting to know more about as much as I did.

Can you tell us a little about yourself (hobbies, education, etc):

I think the only things that matter to a geek are vi/emacs, and windows/linux/osx, right?

emacs or vi? Emacs. I’ve used the same editor for nearly 30 years.

Windows/Mac/Linux? Mac, but only barely above linux. OSX is the practical choice for writing software that must work on all platforms. Plus, at home I find the Mac to be very low maintenance.

I’ve been writing software professionally since the mid 1980’s. I started as a FORTRAN programmer, picked up C, then perl, awk, sed, bourne shell, all the usual unix tools. I then became a die-hard Tcl/tk programmer for more than a decade before picking up Python. I’ve been using Python for the past half dozen years or so. Somewhere in the middle of all that I did a year or so doing Java.

I currently live in a Chicago suburb, but grew up and spent most of my life a bit further south in Oklahoma and Arkansas, with short stints in Texas and Colorado. I have a couple kids, the youngest of which is poised to graduate from high school this year. I’m a huge movie fan, especially of independents. I love playing pinball. I tend to wear Hawaiian shirts most days (which is why my stackoverflow icon is an hawaiian shirt), and would wear shorts and sandals every day if the weather (and my current gig’s dress code) allowed.

Why did you start using Python?

In 2009 I got a gig at Orbitz in Chicago and they put me on a team that used Python. I didn’t know Python at the time, but was pretty fluent in Perl and Tcl so I guess they they figured I could pick it up. Fun fact: this was the third job I’ve taken where I didn’t know the language I was hired to use. The other languages I didn’t know at the time were Tcl and Java. I’ve always had a natural ability to work with scripting languages, or at least I’m pretty good at convincing people of that fact in interviews.

The team at Orbitz was working on a testing harness, which set me on the path I’ve been on ever since, which is writing software tools in QA (or as I like to put it, writing software to test software). Since Orbitz, I’ve had two other jobs where I’ve been the architect and lead developer on a team supporting automated testing.

What other programming languages do you know and which is your favorite?

I’ve already touched on several: FORTRAN, C, Perl, Tcl. I have also written a few thousand lines of LISP in my past, as well as smatterings of Ruby, Groovy, Java, C++ and Objective-C, as well as the usual unixy suspects such as bash, awk, sed, etc. Lately I’ve written a fair amount of javascript. Of all those, FORTRAN, C, Tcl and Python are the ones I’ve used the most in a professional capacity.

As for a favorite? Hard to say. The easy answer is Python, since that’s what I’m using now. There’s an awful lot to love about Python and the huge pile of modules that are available. I’ll be honest, though, and say that even after several years of constant use I still don’t like using whitespace to define blocks of code. I’ve heard all the arguments for it, but I’m not convinced. There, that’ll give your readers something to comment about!

I still really love the Tcl language. It’s an acquired taste that most people never acquire, but of all the languages I’ve used Tcl is the one that fits my brain better than any other. It is a beautiful little language. Learning it literally took me about half a day and I was off to the races. However, Tcl has such a small community, with a relatively small library of packages compared to python, and the number of Tcl jobs is fast approaching zero, so it’s becoming much less relevant in my toolbox. Plus, it’s OO support isn’t nearly as nice as Python’s.

I would love a chance to use LISP professionally, and would also like to use Groovy. I’ve only barely used Groovy but immediately fell in love with it when I first encountered it.

What projects are you working on now?

I am building tools for test automation. Writing tools for software development has been something I’ve always done no matter what my day job required. Like all good (read: lazy) programmers, I like to write tools to make my job easier.

At Orbitz I started working on test automation tools, and realized that this is an area that is sorely lacking in decent tools. Most QA tools at the time were for managing test cases, not writing them; the actual process of writing a test was to fill in a form or create a work document. Yuck! A .NET programmer has Visual Studio, ReSharper, a million tools at their disposal. Linux and OSX developers has a similar wealth of tools. What does a tester have? Microsoft Word? Though that is starting to change with tools like easyb, cucumber, specflow and the like.

I’ve made it something of a small personal mission to do my part to fix that. Starting at Orbitz and on through to my current gig, we’ve used a tool called the robot framework (robotframework.org) to do test automation. It’s a great framework that makes it possible to write human-friendly test cases, but with the power of python behind it so you can test literally almost anything with it. I’ve written a very brief blog post about why I like it here: http://boakley.github.io/2014/07/02/what-is-the-robot-framework.

Even though the robot framework is mature and being actively developed by a very small team, the official IDE is not very good in my opinion. I’ve seen lots of people try to use it, and then switch and try to use standard text editors (the test files are all plain text, so you can use anything you want). I wrote some plugins for the IDE a while ago, and learned a lot about what people want and need for developing high quality tests.

I have a vision for some professional grade tools built on top of the framework for serious testers, and I’m working toward that vision. I made some progress at my last employer but they wouldn’t let me open source the work so I left. My current employer, Echo Global Logistics (echo.com) is very generous in letting me make these projects available as open source. I’ve written a robot extension in javascript for the marvelous brackets editor (brackets.io), and I’m working on a linter, a website for viewing test documentation, and a dashboard for collecting test results across our testing environments, all in python.

Which Python libraries are your favorite (core or 3rd party)?

There’s a tie for first place. I would have to say the one I use the most is the robot framework. It’s not only a testing tool, but much of it is available as modules, which makes it possible for me to build new tools that work with robot test files.

My second favorite is Tkinter, though more for sentimental reasons. I rarely use it at work. Back when I was first learning python I was fresh off of a decade of doing UI development in Tcl/Tk. I figured one of the best ways to learn python fairly deeply was to answer technical questions. Since I was a tk expert, I decided to leverage that and become a tkinter expert. So, I started answering as many Tkinter questions as I could on stack overflow. When I answered my first Tkinter question I had never actually used Tkinter.

I think Tkinter is an absolutely fantastic GUI library, especially combined with the object oriented nature of Python. Many people deride it as old, ugly, and hard to learn. After having used many GUI toolkits spanning more than a couple decades I’ve come to realize that most of that is untrue, and what is untrue doesn’t really matter. I would never use tkinter to create the next photoshop or itunes, but for the vast majority of GUIs most people write, it’s more than good enough.

Lately I’ve also been using flask for some internal web sites and web services. I’m not much of a web developer, but flask makes it really easy to throw together a web ui and restful service without having to worry too much about the plumbing. It lets me focus most of my energy on the actual data business logic of the services.

Is there anything else you’d like to say?

I really appreciate you giving me the opportunity to be part of your blog. If any of your readers are wanting or needing to get into test automation, I strongly encourage them to check out robot framework. Don’t let the robot IDE scare you away — ignore it and use brackets or the editor of your choice.

Thanks so much!

The Last 10 PyDevs of the Week

Categories: FLOSS Project Planets

Doug Vann: Doing Well with Drupal and Doing Good for Others: A Call For Help

Planet Drupal - Mon, 2015-03-02 08:00

Subtitle: Why I'm Encouraging the Drupal Community to Support the IndieGoGo Campaign Posted by Fellow Drupaler Andy Laken Helping a Brave Girl Overcome Addiction. 

When I saw Andy's post about his sister-in-law on Facebook a few nights ago, my heart was immediately moved. I only know the brief summary he explains in his IndieGoGo campaign post, but I knew it was something I HAD ot get behind. Moreover, I had to jump in and see it through. We can't expect Andy and his wife to do it all and carry the full brunt of this load. THIS is where crowdfunding really really shines! :-)

The fact is that many of us are doing swimmingly well with our Drupal careers and our Drupal businesses. For many of us, Drupal has opened up a world of opportunity where demand is high and the supply is low. This is the very recipe for high billable rates. Every year I do my taxes I am faced with the sheer volume of plane tickets, taxis, hotels, & restaurant charges I have racked up. It IS a good, if not hectic, life! :-)

Now turn your attention to the opportunity that we all have to help change the life of a young girl, Carmen, who is taking extraordinary steps to do the right thing. We have 5 days to hit this very small goal. Frankly I'd like to see us double it, but that is up to you.


Drupal Planet

View the discussion thread.

Categories: FLOSS Project Planets

FSF Events: Richard Stallman to speak in Iligan, Philippines

GNU Planet! - Mon, 2015-03-02 07:53

Richard Stallman's speech will be nontechnical, admission is gratis, and the public is encouraged to attend.

Speech title, exact location, and start time to be determined.

Please fill out our contact form, so that we can contact you about future events in and around Iligan.

Categories: FLOSS Project Planets

groups.drupal.org frontpage posts: Florida Drupalcamp 2015 Open for Registration!

Planet Drupal - Mon, 2015-03-02 07:36

Florida DrupalCamp is now taking registrations and session submissions! Register at https://www.fldrupal.camp! The event will be taking place at the beautiful campus of Florida Technical College in Orlando, Florida on Saturday, Apr 11-12th.

Early-bird registration is only $25 and includes lunch and an awesome tshirt! Register today (before we raise the price on you)!


Categories: FLOSS Project Planets
Syndicate content