/plesk2ispconfig

Convert Plesk installations to ISPconfig

Primary LanguagePerl 6

NAME
        plesk2ispconfig - convert Plesk installations to ISPconfig


SYNOPSIS
        plesk2ispconfig [--config=file.yml]


DESCRIPTION

This script helps you migrate most of your Plesk installation to ISPconfig,
namely client accounts, mail addresses (mailboxes, aliases and forwards), web
sites and some databases. You configure it through a simple config file, mainly
for the credentials to access your installations and your server addresses, and
the rest should be fully automatic.

OPTIONS
    --config FILE
        A YAML config file, see below.
    --modules MODULE[,MODULE ...]
        Modules to run. Default is to run all available.
    --listmodules
        List available modules and exit.
    --domains DOMAIN[,DOMAIN ...]
        Process only these domains.
    --robust
        Print an error message and continue on database or SOAP communication
        errors instead of aborting.
    --debug
        Print fairly detailed information to help trace where things go wrong.

CONFIGURATION

Configuration is through a file written in YAML (http://yaml.org). The default
looks like this---just replace the values in there but don't change the format.
The script validates the contents though to make sure everything it needs is
there.

---
defaults:
  mail:
    gid: 5000
    homedir: /var/vmail
    maildir: /var/vmail/%d/%a
    uid: 5000
  web:
    allow_override: All
    ip_map:
      1.2.3.4: 5.6.7.8
    ruby: y
    suexec: y
    traffic_quota_lock: n
    stats_type: webalizer
  dns:
    ns: ns.domain.tld
    xfer: 4.5.6.7
  users:
    userdir: /var/www/clients/client%c/web%a
    webuserdir: /var/www/clients/client%c/%a/web_user/%a
server:
  mail: 1.2.3.4
  web: 1.2.3.4
  db: 1.2.3.4
  dns: 1.2.3.4
plesk:
  db: psa
  host: 127.0.0.1
  port: 3306
  user: pleskuser
  pass: pleskpass
  key: secret_key_file
  sync:
    host: 127.0.0.1
    user: root
    port: 22
ispconfig:
  uri: http://localhost:8079/remote/
  proxy: http://localhost:8079/remote/index.php
  user: apiuser
  pass: 123456
postscript: execute_me_later.sh
mailsync:
  writerc: migration_offlineimap.rc
  fromserver: mail.%d
  use_ssl: 1

The "plesk" and "ispconfig" sections should be self-explanatory: they specify
how to access your respective installations. While ISPconfig has a reasonably
easy SOAP interface (in as far as that can be said about *any* SOAP interface),
Plesk's homegrown "XML RPC" is a complete train wreck so I speak SQL directly to
its database. This has only been tested with Plesk 9.5 though!

The "server" section simply specifies your ISPconfig server IPs. If you have
only one server for several functions (web/mail/db), just specify the same
address repeatedly.

The "defaults" contain settings that are found in ISPconfig but not directly
equivalent in Plesk. The following might need explanation:

ip_map: map old Plesk web server IPs to new ISPconfig ones. If you had several
        IPs and your sites distributed across them, this will recreate the
        same distribution in ISPconfig.
allow_override: Apache-style directive for .htaccess override permissions
                for every site.
maildir: A printf-style string that has "%d" replaced by the mail domain and
        "%a" by the account name. Some people prefer the full mail address in
        the final part, like "/var/vmail/%d/%a@%d", or for very small sites
        "/var/vmail/%a@%d"
stats_type: The kind of webstats program the site wants. I have no idea whether
            anything besides "webalizer" really works.
postscript: The name of a script that plesk2ispconfig will write and that must
            be executed on the ISPconfig system later to complete the migration.
            As ISPconfig sensibly hands off more complicated actions such as
            website creation to a cron job, we can't assume all of that has been
            done when an API call returns so we have to defer rsyncing of
            websites and dumping/restoring of databases as well. After the
            script finishes, copy the file to the target server, wait ~10min and
            execute it. It uses the user, host and port entries under
            plesk->sync to log in to the Plesk system using SSH. Every step
            opens a new connection so you'd better set up public-key
            authentication to this account if you want to avoid typing the same
            password over and over again.
mailsync: plesk2ispconfig writes an offlineimaprc file named as specified under
          "writerc". Using this to run the "offlineimap" tool, you can
          synchronize IMAP accounts from source to target even if they use
          different server software. "fromserver" is the server name to connect
          to, in case it's not the one Plesk runs on; this field can use the
          "%d" placeholder for the client account's domain name. The default
          would read IMAP data for user@example.com from mail.example.com.

databases: These settings control the migration of databases.
           Currently the only setting is a boolean value under "rewrite_names"
           that controls whether or not to rewrite database names to ISPconfig's
           scheme. Both have their drawbacks:
           - If you do rewrite the names, database and user names will get a
           prefix of c_$CLIENTID and cu_$CLIENTID respectively. Changing the
           database settings in ISPconfig will work but you'll have to change
           the credentials in all installed web applications, CMSs and whatever
           uses these databases. Theoretically we could guess the system and add
           an edit script after webspace rsyncing but this will probably only
           ever happen for the most common ones like Joomla, Wordpress and
           Drupal.
           - If you do not rewrite the names, you save the hassle of changing
           each site's DB credentials but changing anything about the DB later
           in ISPconfig will fail. Then the only solution is to create a new
           database in ISPconfig, dump the old one and restore it into the new
           one before DROPping it.
dns: These settings control the migration of DNS zones.
     - The IP address of the ISPConfig system that will handle DNS
     - The name server to put in the SOA for each zone
     - The IP addresses of DNS servers that can transfer zones from ISPConfig

key: The location of the server-specific secret key file on the Plesk system,
     usually /etc/psa/private/secret_key

users: Patterns for the user's folder on the ISPConfig system.  %a is replaced
       by the account name and %c by the client ID.
           
BUGS AND LIMITATONS

We're getting there. The script has done its first complete migration with only
little manual cleanup afterwards, but one should still take care and give the
resulting shell scripts at least a quick looking over before running them.
Particularly the following things should be kept in mind if they apply to your
system:

- The database format may have changed in Plesk 10 and cause things to break.
  If you have a Plesk10 installation that you'd like to convert, send me a dump
  (edit out your passwords though, they are stored in clear text) and I'll have
  a look.
- Custom name servers are not supported yet.
- The only database server supported is mysql. I haven't had a need
  for anything else, but support shouldn't be hard to add.
- Web stats should be preserved if using the same system (webalizer, awstats
  etc.) on both installations, but are not.
- Error handling is rather crude.

If you should run into an error that says "SOAP error for method
`domains_domain_add': You do not have the permissions to access this function.",
this is likely an ISPconfig bug though. You have two possibilities to work
around it:
a) Find the function "domains_domain_add" in
/usr/local/ispconfig/interface/lib/classes/remoting.inc.php and delete the whole
checkPerm() call (i.e. all but the function's last line)
b) Disable the Domains module (it's not essential for the migration to work) by
calling the converter with "--modules Clients,Databases,Mail,Websites"


REQUIREMENTS
        Perl and the following modules:
	local::lib
        Modern::Perl
        Moose
        MooseX::ClassAttribute
        MooseX::Declare
        MooseX::Types
        MooseX::Types::DateTime::ButMaintained
	MooseX::Getopt
        List::MoreUtils
	LWP::Protocol::https
        Method::Signatures::Modifiers
        Crypt::Rijndael
        DateTime::Format::MySQL
        Data::Dumper
	DBD::MySQL
        DBIx::Simple
        Digest::MD5
        MIME::Base64
        Scalar::Util
        SOAP::Lite
        YAML
        Regexp::Common
        Regexp::IPv6

AUTHOR
	Matthias Bethke <matthias@towiski.de>