diff --git a/bin/noblogs b/bin/noblogs
deleted file mode 100644
index 70ecac23c23448df3ab207c36e963166fa64bbde..0000000000000000000000000000000000000000
--- a/bin/noblogs
+++ /dev/null
@@ -1,430 +0,0 @@
-#!/suca/dai/php5 -f
-<?php
-
-include('/usr/local/lib/noblogs-cli/noblogs.php');
-
-function help() {
-?>
-Usage: noblogs <COMMAND> [<ARGS>...]
-
-Known commands:
-
-   info BLOG [...]
-      Print some basic information about one or more blogs.
-
-   connectdb BLOG
-      Connect to the MySQL instance that has the blog db.
-
-   get-option OPTION_NAME BLOG [...]
-      Print the value of an option for the specified blogs.
-
-   set-option OPTION_NAME OPTION_VALUE BLOG [...]
-      Set the value of an option for the specified blogs.
-
-   print-all-blogs
-      Print a list of all existing blog IDs.
-
-   print-local-blogs
-      Print a list of just those blog IDs that are hosted on this
-      server.
-
-   dump-shards
-      Print a JSON dictionary representing the full backend -> blogs
-      map.
-
-   check-upgrade BLOG [...]
-      Check whether the specified blogs need to be upgraded.
-
-   upgrade BLOG [...]
-      Upgrade the specified blogs. NOTE: upgrading a blog that is
-      not local is dangerous! Use the 'on-local-blogs' wrapper.
-
-   run-cron BLOG [...]
-      Run cron jobs for the specified blogs. NOTE: running cron jobs
-      for a blog that is not local is dangerous! Use the 'on-local-blogs'
-      wrapper.
-
-   fix-rewrites BLOG [...]
-      Fix broken rewrite rules for the specified blogs. NOTE: dangerous!!!!
-
-   close-comments-if-inactive BLOG [...]
-      Closes old posts for comments on non-active blogs.
-
-   remove-network-upgrade-message
-      Remove the 'network upgrade' message when all the blogs have
-      been upgraded individually.
-
-   update-friend-domains
-      Update the list of 'friend' email domains.
-
-   check-updates
-      Check for updates of core, plugins and themes.
-      Options:
-	-force	prints the known updates when not checking for the new ones
-	-mail	sends email to ai-changes@investici.org
-	-json	print JSON output
-
-   set-readonly on|off
-      Set read-only mode for the local noblogs installation. The argument
-      must be either the literal 'on' or 'off'.
-
-<?php
-  exit(1);
-}
-
-// 'info': Return information about a single blog.
-function do_info($args) {
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      die("Blog not found.\n");
-    }
-    $status = 'active';
-    if ($blog->deleted) {
-      $status = 'deleted';
-    } elseif ($blog->archived) {
-      $status = 'archived';
-    }
-    $dbinfo = noblogs_get_backend_for_blog($blog->blog_id);
-
-    echo "ID:          {$blog->blog_id}\n";
-    echo "Name:        {$blog->domain}\n";
-    echo "Host:        {$dbinfo['host']}\n";
-    echo "Status:      {$status}\n";
-    echo "Registered:  {$blog->registered}\n";
-    echo "Last Update: {$blog->last_updated}\n";
-    echo "\n";
-  }
-}
-
-
-// 'connectdb': Connect to the database hosting a specific blog.
-function do_connectdb($args) {
-  $blog = noblogs_get_blog($args[0]);
-  if (!$blog) {
-    die("Blog not found.\n");
-  }
-  $backend = noblogs_get_backend_for_blog($blog->blog_id);
-
-  echo "ID:  {$blog->blog_id}\n";
-  $cmd = "mysql -A -h {$backend['host']} -P {$backend['port']} -u{$backend['user']} -p{$backend['password']} {$backend['db']}";
-  echo "$cmd\n";
-  //system($cmd);
-}
-
-
-// 'get-option': Print the value of a blog option.
-function do_get_option($args) {
-  $option = $args[0];
-  if (!$option) {
-    echo "Not enough arguments\n";
-    help();
-  }
-
-  foreach (array_splice($args, 1) as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-
-    switch_to_blog($blog->blog_id);
-    $value = get_option($option);
-    if ($value) {
-      if (is_array($value)) {
-        // Use JSON as a string representation.
-        $value = json_encode($value);
-      }
-      echo "{$arg}: {$value}\n";
-    }
-    restore_current_blog();
-  }
-}
-
-// 'set-option': Set the value of a blog option.
-function do_set_option($args) {
-    $option = array_shift($args);
-    if (!$option) {
-        echo "Not enough arguments\n";
-        help();
-    }
-    $value = array_shift($args);
-    if ($value === null) {
-        echo "Not enough arguments\n";
-        help();
-    }
-
-
-    foreach ($args as $arg) {
-        $blog = noblogs_get_blog($arg);
-        if (!$blog) {
-            echo "Blog {$arg} not found.\n";
-            continue;
-        }
-
-        switch_to_blog($blog->blog_id);
-        update_option($option, $value);
-        $nv = get_option($option);
-        echo "{$arg}: {$nv}\n";
-        restore_current_blog();
-    }
-}
-
-
-// 'dump-shards': Print a JSON dictionary representing the full map
-// of backend -> blogs database mappings.
-function do_dump_shards($args) {
-  $backend_map = noblogs_get_backend_map();
-  echo json_encode($backend_map);
-  echo "\n";
-}
-
-
-// 'print-all-blogs': List all blog IDs.
-function do_print_all_blogs($args) {
-  $blogs = noblogs_get_blogs();
-  foreach ($blogs as $blog) {
-    echo "{$blog->blog_id}\n";
-  }
-}
-
-
-// 'print-local-blogs': List the blog IDs that are local to this machine.
-function do_print_local_blogs($args) {
-  $local_blogs = noblogs_get_local_blogs();
-  foreach ($local_blogs as $b) {
-    echo $b . "\n";
-  }
-}
-
-
-// 'remove-network-upgrade-message': Remove the annoying "network
-// upgrade necessary" banner from the dashboard.
-function do_remove_network_upgrade_message($args) {
-  global $wp_db_version;
-  update_site_option('wpmu_upgrade_site', $wp_db_version);
-}
-
-
-// 'check-upgrade': Check if a blog needs to be upgraded.
-function do_check_upgrade($args) {
-  global $wp_db_version;
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-    switch_to_blog($blog->blog_id);
-    $db_version = get_option('db_version');
-    if ($db_version != $wp_db_version) {
-      echo "{$arg}: UPGRADE\n";
-    } else {
-      echo "{$arg}: ok\n";
-    }
-    restore_current_blog();
-  }
-}
-
-
-// 'upgrade': Upgrade a blog.
-function do_upgrade($args) {
-  include(NOBLOGS_ROOT . "/wp-admin/includes/upgrade.php");
-
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-    switch_to_blog($blog->blog_id);
-    wp_upgrade();
-    echo "{$arg}: ok\n";
-    restore_current_blog();
-  }
-}
-
-
-// 'run-cron': Run cron jobs.
-function do_run_cron($args) {
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-    switch_to_blog($blog->blog_id);
-    noblogs_run_cron_for_current_blog();
-    echo "{$arg}: ok\n";
-    restore_current_blog();
-  }
-}
-
-
-// 'fix-rewrites': Fix rewrite rules
-function do_fix_rewrites($args) {
-    global $wp_rewrite;
-    foreach ($args as $arg) {
-        $blog = noblogs_get_blog($arg);
-        if (!$blog) {
-           echo "Blog {$arg} not found.\n";
-           continue;
-        }
-        switch_to_blog($blog->blog_id);
-        $wp_rewrite->init();
-        create_initial_taxonomies();
-        $wp_rewrite->flush_rules();
-        echo "{$arg}: ok\n";
-        restore_current_blog();
-    }
-}
-
-function do_update_friend_domains($args) {
-  $domains = noblogs_list_friend_domains();
-  update_site_option('limited_email_domains', $domains);
-  echo "Update done.\n";
-}
-
-function do_check_spam($args) {
-  global $wpdb;
-  $spamcount = 0;
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-    $spam = $wpdb->get_var("SELECT count(*) FROM wp_".$blog->blog_id ."_comments where comment_approved = 'spam';");
-    $spamcount+=$spam;
-    printf("%s - %d : %d\n", $blog->domain, $blog->blog_id, $spam);
-  }
-  printf("Found %d spam comments\n", $spamcount);
-}
-
-function do_nuke_spam($args) {
-  global $wpdb;
-  foreach ($args as $arg) {
-    $blog = noblogs_get_blog($arg);
-    if (!$blog) {
-      echo "Blog {$arg} not found.\n";
-      continue;
-    }
-    $spam = $wpdb->get_var("DELETE FROM wp_".$blog->blog_id ."_comments where comment_approved = 'spam' and comment_date < '".date('Y-m-d',time() - (86400 * 60))."';");
-    printf("%s - %d : %d\n", $blog->domain, $blog->blog_id, $spam);
-  }
-}
-
-function do_close_comments_if_inactive($args) {
-    global $wpdb;
-    foreach ($args as $arg) {
-        $blog = noblogs_get_blog($arg);
-        if (!$blog) {
-            echo "Blog {$arg} not found.\n";
-            continue;
-        }
-        switch_to_blog($blog->blog_id);
-        if (get_option('close_comments_for_old_posts') == '1') {
-            echo "Blog {$blog->domain} already closed to comments, skipping.\n";
-            continue;
-        } else if (noblogs_is_stale()) {
-            echo "Closing comments on blog {$blog->domain}.\n";
-            update_option('close_comments_for_old_posts', '1');
-            update_option('close_comments_days_old', '90');
-        } else {
-            echo "Leaving comments opened on blog {$blog->domain}.\n";
-        }
-    }
-}
-
-function check_updates_parse_flags($args) {
-  $flags = array();
-  foreach (array('json', 'force', 'mail') as $f){
-    $flags[$f] = in_array('-' . $f, $args);
-  }
-  return $flags;
-}
-
-// 'check-updates': check for core, plugins and theme updates
-function do_check_updates($args) {
-  $alertmail = "root@localhost";
-  $flags = check_updates_parse_flags($args);
-  global $wp_version;
-
-  $updates = array();
-  $updates['core'] = array();
-  $updates['plugins'] = array();
-  $updates['themes'] = array();
-
-  $txt = '';
-
-  $check = $flags['force'];
-  $check = wp_version_check() || $check;
-  $check = wp_update_plugins() || $check;
-  $check = wp_update_themes() || $check;
-  if (!$check) {
-    $flags['json'] || print "Check is too soon, exiting\n" ;
-    exit(1);
-  }
-
-  foreach(get_site_transient('update_core')->updates as $update) {
-    if($update->current != $wp_version) {
-      $txt .= sprintf("Core version: %s\n\n", $update->current);
-      $updates['core'][] = array('version' => $update->current,
-				 'url' => $update->package);
-    }
-  }
-
-  foreach(get_site_transient('update_plugins')->response as $update) {
-    $txt .= sprintf("Plugin: %s\nVersion: %s\nURL: %s\n\n",
-                           $update->slug, $update->new_version, $update->package);
-    $updates['plugins'][] = array('name' => $update->slug,
-                                  'version' => $update->new_version,
-                                  'url' => $update->package);
-  }
-
-  foreach(get_site_transient('update_themes')->response as $name => $update) {
-    $txt .= sprintf("Theme: %s\nVersion: %s\nURL: %s\n\n",
-                           $name, $update['new_version'], $update['package']);
-    $updates['themes'][] = array('name' => $name,
-                                 'version' => $update['new_version'],
-                                 'url' => $update['package']);
-  }
-
-  if ($flags['mail']){
-    wp_mail($alertmail, "[Noblogs-Alert] Updates are available", $txt);
-  }
-
-  if ($flags['json']){
-    print json_encode($updates);
-  } else {
-    print $txt;
-  }
-
-}
-
-// 'set-readonly': toggle readonly mode by modifying .htaccess
-function do_set_readonly($args) {
-  $htaccess = NOBLOGS_ROOT . '/.htaccess';
-  if ($args[0] == "on") {
-    comment_with_markers($htaccess, 'readonly', false);
-  } elseif ($args[0] == "off") {
-    comment_with_markers($htaccess, 'readonly', true);
-  } else {
-    print "Argument must be either 'on' or 'off'.";
-  }
-}
-
-
-// Command-line parsing.
-$cmd = $argv[1];
-if (!$cmd) {
-  help();
-}
-
-$cmd_func = "do_" . str_replace('-', '_', $cmd);
-if (!function_exists($cmd_func)) {
-  echo "Unknown command '".$cmd."'\n\n";
-  help();
-}
-call_user_func($cmd_func, array_slice($argv, 2));
-
diff --git a/bin/noblogs.in b/bin/noblogs.in
index 45158c38dab62103a872900ae9936112cbc9d211..05fd9a79fc8be7f4b1f5b97e136ee65e305d0b11 100755
--- a/bin/noblogs.in
+++ b/bin/noblogs.in
@@ -64,6 +64,10 @@ Known commands:
 	-mail	sends email to ai-changes@investici.org
 	-json	print JSON output
 
+   set-readonly on|off
+      Set read-only mode for the local noblogs installation. The argument
+      must be either the literal 'on' or 'off'.
+
 <?php
   exit(1);
 }
@@ -398,6 +402,18 @@ function do_check_updates($args) {
 
 }
 
+// 'set-readonly': toggle readonly mode by modifying .htaccess
+function do_set_readonly($args) {
+  $htaccess = NOBLOGS_ROOT . '/.htaccess';
+  if ($args[0] == "on") {
+    comment_with_markers($htaccess, 'readonly', false);
+  } elseif ($args[0] == "off") {
+    comment_with_markers($htaccess, 'readonly', true);
+  } else {
+    print "Argument must be either 'on' or 'off'.";
+  }
+}
+
 
 // Command-line parsing.
 $cmd = $argv[1];