2009-12-16 14:02:53 +00:00
#----------------------------------------------------------------------------
# \file dolibarr.pl
# \brief Dolibarr script install for Virtualmin Pro
# \version $Revision$
2010-10-04 21:15:26 +00:00
# \author (c)2009-2010 Regis Houssin <regis@dolibarr.fr>
2009-12-16 14:02:53 +00:00
#----------------------------------------------------------------------------
# script_dolibarr_desc()
sub script_dolibarr_desc
{
return "Dolibarr" ;
}
sub script_dolibarr_uses
{
return ( "php" ) ;
}
# script_dolibarr_longdesc()
sub script_dolibarr_longdesc
{
return "Dolibarr ERP/CRM is a powerful Open Source software to manage a professional or foundation activity (small and medium enterprises, freelancers)." ;
}
2010-04-05 17:42:45 +00:00
sub script_dolibarr_author
{
return "Regis Houssin" ;
}
2009-12-16 14:02:53 +00:00
# script_dolibarr_versions()
sub script_dolibarr_versions
{
2010-10-04 13:22:13 +00:00
return ( "2.9.0" , "2.8.1" ) ;
2010-04-05 17:42:45 +00:00
}
2009-12-16 14:02:53 +00:00
sub script_dolibarr_category
{
2010-04-05 17:42:45 +00:00
return "Commerce" ;
2009-12-16 14:02:53 +00:00
}
sub script_dolibarr_php_vers
{
2010-04-03 23:16:30 +00:00
return ( 5 ) ;
2009-12-16 14:02:53 +00:00
}
sub script_dolibarr_php_vars
{
2010-10-04 13:22:13 +00:00
return ( [ 'memory_limit' , '64M' , '+' ] ,
2009-12-16 14:02:53 +00:00
[ 'upload_max_filesize' , '10M' , '+' ] ,
[ 'max_execution_time' , '60' , '+' ] ) ;
}
sub script_dolibarr_php_modules
{
local ( $ d , $ ver , $ phpver , $ opts ) = @ _ ;
local ( $ dbtype , $ dbname ) = split ( /_/ , $ opts - > { 'db' } , 2 ) ;
return $ dbtype eq "mysql" ? ( "mysql" ) : ( "pgsql" ) ;
}
sub script_dolibarr_dbs
{
local ( $ d , $ ver ) = @ _ ;
return ( "mysql" , "postgres" ) ;
}
# script_dolibarr_params(&domain, version, &upgrade-info)
# Returns HTML for table rows for options for installing dolibarr
sub script_dolibarr_params
{
local ( $ d , $ ver , $ upgrade ) = @ _ ;
local $ rv ;
local $ hdir = & public_html_dir ( $ d , 1 ) ;
if ( $ upgrade ) {
# Options are fixed when upgrading
local ( $ dbtype , $ dbname ) = split ( /_/ , $ upgrade - > { 'opts' } - > { 'db' } , 2 ) ;
$ rv . = & ui_table_row ( "Database for Dolibarr tables" , $ dbname ) ;
local $ dir = $ upgrade - > { 'opts' } - > { 'dir' } ;
$ dir =~ s/^$d->{'home'}\/// ;
$ rv . = & ui_table_row ( "Install directory" , $ dir ) ;
}
else {
# Show editable install options
local @ dbs = & domain_databases ( $ d , [ "mysql" ] ) ;
$ rv . = & ui_table_row ( "Database for Dolibarr tables" ,
& ui_database_select ( "db" , undef , \ @ dbs , $ d , "dolibarr" ) ) ;
$ rv . = & ui_table_row ( "Install sub-directory under <tt>$hdir</tt>" ,
& ui_opt_textbox ( "dir" , "dolibarr" , 30 ,
"At top level" ) ) ;
2010-10-04 21:07:21 +00:00
if ( $ d - > { 'ssl' } && $ ver >= 2.9 ) {
$ rv . = & ui_table_row ( "Force https connection?" ,
2010-10-04 21:15:26 +00:00
& ui_yesno_radio ( "forcehttps" , 0 ) ) ;
2010-10-04 21:07:21 +00:00
}
2009-12-16 14:02:53 +00:00
}
return $ rv ;
}
# script_dolibarr_parse(&domain, version, &in, &upgrade-info)
# Returns either a hash ref of parsed options, or an error string
sub script_dolibarr_parse
{
local ( $ d , $ ver , $ in , $ upgrade ) = @ _ ;
if ( $ upgrade ) {
# Options are always the same
return $ upgrade - > { 'opts' } ;
}
else {
local $ hdir = & public_html_dir ( $ d , 0 ) ;
$ in { 'dir_def' } || $ in { 'dir' } =~ /\S/ && $ in { 'dir' } !~ /\.\./ ||
return "Missing or invalid installation directory" ;
local $ dir = $ in { 'dir_def' } ? $ hdir : "$hdir/$in{'dir'}" ;
local ( $ newdb ) = ( $ in - > { 'db' } =~ s/^\*// ) ;
return { 'db' = > $ in - > { 'db' } ,
'newdb' = > $ newdb ,
'dir' = > $ dir ,
'path' = > $ in - > { 'dir_def' } ? "/" : "/$in->{'dir'}" ,
2010-10-04 21:07:21 +00:00
'forcehttps' = > $ in - > { 'forcehttps' } , } ;
2009-12-16 14:02:53 +00:00
}
}
# script_dolibarr_check(&domain, version, &opts, &upgrade-info)
# Returns an error message if a required option is missing or invalid
sub script_dolibarr_check
{
local ( $ d , $ ver , $ opts , $ upgrade ) = @ _ ;
$ opts - > { 'dir' } =~ /^\// || return "Missing or invalid install directory" ;
$ opts - > { 'db' } || return "Missing database" ;
if ( - r "$opts->{'dir'}/conf/conf.php" ) {
return "Dolibarr appears to be already installed in the selected directory" ;
}
local ( $ dbtype , $ dbname ) = split ( /_/ , $ opts - > { 'db' } , 2 ) ;
local $ clash = & find_database_table ( $ dbtype , $ dbname , "llx_.*" ) ;
$ clash && return "Dolibarr appears to be already using the selected database (table $clash)" ;
return undef ;
}
# script_dolibarr_files(&domain, version, &opts, &upgrade-info)
# Returns a list of files needed by dolibarr, each of which is a hash ref
# containing a name, filename and URL
sub script_dolibarr_files
{
local ( $ d , $ ver , $ opts , $ upgrade ) = @ _ ;
local @ files = ( { 'name' = > "source" ,
'file' = > "Dolibarr_$ver.tar.gz" ,
'url' = > "http://www.dolibarr.fr/files/stable/dolibarr-$ver.tar.gz" } ) ;
return @ files ;
}
sub script_dolibarr_commands
{
return ( "tar" , "gunzip" ) ;
}
# script_dolibarr_install(&domain, version, &opts, &files, &upgrade-info)
# Actually installs joomla, and returns either 1 and an informational
# message, or 0 and an error
sub script_dolibarr_install
{
local ( $ d , $ version , $ opts , $ files , $ upgrade , $ domuser , $ dompass ) = @ _ ;
local ( $ out , $ ex ) ;
if ( $ opts - > { 'newdb' } && ! $ upgrade ) {
local $ err = & create_script_database ( $ d , $ opts - > { 'db' } ) ;
return ( 0 , "Database creation failed : $err" ) if ( $ err ) ;
}
local ( $ dbtype , $ dbname ) = split ( /_/ , $ opts - > { 'db' } , 2 ) ;
local $ dbuser = $ dbtype eq "mysql" ? & mysql_user ( $ d ) : & postgres_user ( $ d ) ;
local $ dbpass = $ dbtype eq "mysql" ? & mysql_pass ( $ d ) : & postgres_pass ( $ d , 1 ) ;
local $ dbphptype = $ dbtype eq "mysql" ? "mysqli" : "pgsql" ;
local $ dbhost = & get_database_host ( $ dbtype ) ;
local $ dberr = & check_script_db_connection ( $ dbtype , $ dbname , $ dbuser , $ dbpass ) ;
return ( 0 , "Database connection failed : $dberr" ) if ( $ dberr ) ;
# Extract tar file to temp dir and copy to target
local $ temp = & transname ( ) ;
local $ err = & extract_script_archive ( $ files - > { 'source' } , $ temp , $ d ,
$ opts - > { 'dir' } , undef ) ;
$ err && return ( 0 , "Failed to extract source : $err" ) ;
# Add config file
local $ cfiledir = "$opts->{'dir'}/conf/" ;
local $ docdir = "$opts->{'dir'}/documents" ;
local $ cfile = $ cfiledir . "conf.php" ;
local $ oldcfile = & transname ( ) ;
local $ olddocdir = & transname ( ) ;
local $ url ;
2010-10-07 17:12:26 +00:00
$ tmpl = & get_template ( $ d - > { 'template' } ) ;
$ charset = $ tmpl - > { 'mysql_charset' } ;
$ collate = $ tmpl - > { 'mysql_collate' } ;
$ encoding = $ tmpl - > { 'postgres_encoding' } ;
2009-12-16 14:02:53 +00:00
$ path = & script_path_url ( $ d , $ opts ) ;
if ( $ path =~ /^https:/ ) {
2010-04-05 19:09:08 +00:00
$ url = "https://$d->{'dom'}" ;
2009-12-16 14:02:53 +00:00
}
else {
2010-04-05 19:09:08 +00:00
$ url = "http://$d->{'dom'}" ;
2009-12-16 14:02:53 +00:00
}
if ( $ opts - > { 'path' } =~ /\w/ ) {
$ url . = $ opts - > { 'path' } ;
}
if ( ! $ upgrade ) {
local $ cdef = "$opts->{'dir'}/conf/conf.php.example" ;
& run_as_domain_user ( $ d , "cp " . quotemeta ( $ cdef ) . " " . quotemeta ( $ cfile ) ) ;
2010-10-04 21:07:21 +00:00
& set_ownership_permissions ( undef , undef , 0777 , $ cfiledir ) ;
& set_ownership_permissions ( undef , undef , 0666 , $ cfile ) ;
& run_as_domain_user ( $ d , "mkdir " . quotemeta ( $ docdir ) ) ;
& set_ownership_permissions ( undef , undef , 0777 , $ docdir ) ;
2009-12-16 14:02:53 +00:00
}
else {
2010-10-04 21:07:21 +00:00
# Preserve old config file and documents directory
2009-12-16 14:02:53 +00:00
& copy_source_dest ( $ cfile , $ oldcfile ) ;
& copy_source_dest ( $ docdir , $ olddocdir ) ;
}
if ( $ upgrade ) {
# Put back original config file and documents directory
& copy_source_dest_as_domain_user ( $ d , $ oldcfile , $ cfile ) ;
& copy_source_dest_as_domain_user ( $ d , $ olddocdir , $ docdir ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# First page (Update database schema)
local @ params = ( [ "action" , "upgrade" ] ,
2010-04-04 08:15:20 +00:00
[ "versionfrom" , $ upgrade - > { 'version' } ] ,
[ "versionto" , $ ver ] ,
2009-12-16 14:02:53 +00:00
) ;
local $ err = & call_dolibarr_wizard_page ( \ @ params , "upgrade" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# Second page (Migrate some data)
2010-04-03 23:16:30 +00:00
local @ params = ( [ "action" , "upgrade" ] ,
2010-04-04 08:15:20 +00:00
[ "versionfrom" , $ upgrade - > { 'version' } ] ,
[ "versionto" , $ ver ] ,
2010-04-03 23:16:30 +00:00
) ;
2009-12-16 14:02:53 +00:00
local $ err = & call_dolibarr_wizard_page ( \ @ params , "upgrade2" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2010-04-04 08:15:20 +00:00
# Third page (Update version number)
local @ params = ( [ "action" , "upgrade" ] ,
[ "versionfrom" , $ upgrade - > { 'version' } ] ,
[ "versionto" , $ ver ] ,
) ;
local $ err = & call_dolibarr_wizard_page ( \ @ params , "etape5" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# Remove the installation directory.
local $ dinstall = "$opts->{'dir'}/install" ;
$ dinstall =~ s/\/$// ;
2010-10-07 17:12:26 +00:00
$ out = & run_as_domain_user ( $ d , "rm -Rf " . quotemeta ( $ dinstall ) ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
}
else {
# First page (Db connection and config file creation)
local @ params = ( [ "main_dir" , $ opts - > { 'dir' } ] ,
[ "main_data_dir" , $ opts - > { 'dir' } . "/documents" ] ,
[ "main_url" , $ url ] ,
[ "db_type" , $ dbphptype ] ,
[ "db_host" , $ dbhost ] ,
[ "db_name" , $ dbname ] ,
[ "db_user" , $ dbuser ] ,
[ "db_pass" , $ dbpass ] ,
[ "action" , "set" ] ,
2010-10-04 21:07:21 +00:00
[ "main_force_https" , $ opts - > { 'forcehttps' } ] ,
2010-10-07 17:12:26 +00:00
[ "dolibarr_main_db_character_set" , $ charset ] ,
[ "dolibarr_main_db_collation" , $ collate ] ,
2009-12-16 14:02:53 +00:00
) ;
local $ err = & call_dolibarr_wizard_page ( \ @ params , "etape1" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# Second page (Populate database)
local @ params = ( [ "action" , "set" ] ) ;
local $ err = & call_dolibarr_wizard_page ( \ @ params , "etape2" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# Third page (Add administrator account)
local @ params = ( [ "action" , "set" ] ,
[ "login" , "admin" ] ,
[ "pass" , $ dompass ] ,
[ "pass_verif" , $ dompass ] ,
) ;
local $ err = & call_dolibarr_wizard_page ( \ @ params , "etape5" , $ d , $ opts ) ;
return ( - 1 , "Dolibarr wizard failed : $err" ) if ( $ err ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
# Remove the installation directory and protect config file.
local $ dinstall = "$opts->{'dir'}/install" ;
$ dinstall =~ s/\/$// ;
2010-10-07 17:12:26 +00:00
$ out = & run_as_domain_user ( $ d , "rm -Rf " . quotemeta ( $ dinstall ) ) ;
2009-12-16 14:02:53 +00:00
& set_ownership_permissions ( undef , undef , 0644 , $ cfile ) ;
& set_ownership_permissions ( undef , undef , 0755 , $ cfiledir ) ;
2010-10-04 21:07:21 +00:00
2009-12-16 14:02:53 +00:00
}
# Return a URL for the user
local $ rp = $ opts - > { 'dir' } ;
$ rp =~ s/^$d->{'home'}\/// ;
local $ adminurl = $ url ;
return ( 1 , "Dolibarr installation complete. Go to <a target=_new href='$url'>$url</a> to use it." , "Under $rp using $dbtype database $dbname" , $ url , 'admin' , $ dompass ) ;
}
# call_dolibarr_wizard_page(¶meters, step-no, &domain, &opts)
sub call_dolibarr_wizard_page
{
local ( $ params , $ page , $ d , $ opts ) = @ _ ;
local $ params = join ( "&" , map { $ _ - > [ 0 ] . "=" . & urlize ( $ _ - > [ 1 ] ) } @$ params ) ;
local $ ipage = $ opts - > { 'path' } . "/install/" . $ page . ".php" ;
local ( $ iout , $ ierror ) ;
& post_http_connection ( $ d , $ ipage , $ params , \ $ iout , \ $ ierror ) ;
if ( $ ierror ) {
return $ ierror ;
}
return undef ;
}
# script_dolibarr_uninstall(&domain, version, &opts)
# Un-installs a dolibarr installation, by deleting the directory.
# Returns 1 on success and a message, or 0 on failure and an error
sub script_dolibarr_uninstall
{
local ( $ d , $ version , $ opts ) = @ _ ;
# Remove the contents of the target directory
local $ derr = & delete_script_install_directory ( $ d , $ opts ) ;
return ( 0 , $ derr ) if ( $ derr ) ;
# Remove all llx_ tables from the database
# 3 times because of constraints
& cleanup_script_database ( $ d , $ opts - > { 'db' } , "llx_" ) ;
& cleanup_script_database ( $ d , $ opts - > { 'db' } , "llx_" ) ;
& cleanup_script_database ( $ d , $ opts - > { 'db' } , "llx_" ) ;
# Take out the DB
if ( $ opts - > { 'newdb' } ) {
& delete_script_database ( $ d , $ opts - > { 'db' } ) ;
}
return ( 1 , "Dolibarr directory and tables deleted." ) ;
}
# script_dolibarr_latest(version)
# Returns a URL and regular expression or callback func to get the version
sub script_dolibarr_latest
{
local ( $ ver ) = @ _ ;
2010-04-05 17:42:45 +00:00
if ( $ ver >= 2.8 ) {
return ( "http://www.dolibarr.fr/files/stable/" ,
"dolibarr\\-(2\\.[0-9\\.]+)" ) ;
}
return ( ) ;
2009-12-16 14:02:53 +00:00
}
sub script_dolibarr_site
{
return 'http://www.dolibarr.org/' ;
}
sub script_dolibarr_passmode
{
return 2 ;
}
1 ;