dolibarr.pl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #----------------------------------------------------------------------------
  2. # \file dolibarr.pl
  3. # \brief Dolibarr script install for Virtualmin Pro
  4. # \author (c)2009-2011 Regis Houssin <regis@dolibarr.fr>
  5. #----------------------------------------------------------------------------
  6. # script_dolibarr_desc()
  7. sub script_dolibarr_desc
  8. {
  9. return "Dolibarr";
  10. }
  11. sub script_dolibarr_uses
  12. {
  13. return ( "php" );
  14. }
  15. # script_dolibarr_longdesc()
  16. sub script_dolibarr_longdesc
  17. {
  18. return "Dolibarr ERP/CRM is a powerful Open Source software to manage a professional or foundation activity (small and medium enterprises, freelancers).";
  19. }
  20. sub script_dolibarr_author
  21. {
  22. return "Regis Houssin";
  23. }
  24. # script_dolibarr_versions()
  25. sub script_dolibarr_versions
  26. {
  27. return ( "3.1.0" );
  28. }
  29. sub script_dolibarr_category
  30. {
  31. return "Commerce";
  32. }
  33. sub script_dolibarr_php_vers
  34. {
  35. return ( 5 );
  36. }
  37. sub script_dolibarr_php_vars
  38. {
  39. return ( [ 'memory_limit', '64M', '+' ],
  40. [ 'upload_max_filesize', '10M', '+' ],
  41. [ 'max_execution_time', '60', '+' ] );
  42. }
  43. sub script_dolibarr_php_modules
  44. {
  45. local ($d, $ver, $phpver, $opts) = @_;
  46. local ($dbtype, $dbname) = split(/_/, $opts->{'db'}, 2);
  47. return $dbtype eq "mysql" ? ("mysql") : ("pgsql");
  48. }
  49. sub script_dolibarr_dbs
  50. {
  51. local ($d, $ver) = @_;
  52. return ("mysql", "postgres");
  53. }
  54. # script_dolibarr_params(&domain, version, &upgrade-info)
  55. # Returns HTML for table rows for options for installing dolibarr
  56. sub script_dolibarr_params
  57. {
  58. local ($d, $ver, $upgrade) = @_;
  59. local $rv;
  60. local $hdir = &public_html_dir($d, 1);
  61. if ($upgrade) {
  62. # Options are fixed when upgrading
  63. local ($dbtype, $dbname) = split(/_/, $upgrade->{'opts'}->{'db'}, 2);
  64. $rv .= &ui_table_row("Database for Dolibarr tables", $dbname);
  65. local $dir = $upgrade->{'opts'}->{'dir'};
  66. $dir =~ s/^$d->{'home'}\///;
  67. $rv .= &ui_table_row("Install directory", $dir);
  68. }
  69. else {
  70. # Show editable install options
  71. local @dbs = &domain_databases($d, [ "mysql"]);
  72. $rv .= &ui_table_row("Database for Dolibarr tables",
  73. &ui_database_select("db", undef, \@dbs, $d, "dolibarr"));
  74. $rv .= &ui_table_row("Install sub-directory under <tt>$hdir</tt>",
  75. &ui_opt_textbox("dir", "dolibarr", 30,
  76. "At top level"));
  77. if ($d->{'ssl'} && $ver >= 3.0) {
  78. $rv .= &ui_table_row("Force https connection?",
  79. &ui_yesno_radio("forcehttps", 0));
  80. }
  81. }
  82. return $rv;
  83. }
  84. # script_dolibarr_parse(&domain, version, &in, &upgrade-info)
  85. # Returns either a hash ref of parsed options, or an error string
  86. sub script_dolibarr_parse
  87. {
  88. local ($d, $ver, $in, $upgrade) = @_;
  89. if ($upgrade) {
  90. # Options are always the same
  91. return $upgrade->{'opts'};
  92. }
  93. else {
  94. local $hdir = &public_html_dir($d, 0);
  95. $in{'dir_def'} || $in{'dir'} =~ /\S/ && $in{'dir'} !~ /\.\./ ||
  96. return "Missing or invalid installation directory";
  97. local $dir = $in{'dir_def'} ? $hdir : "$hdir/$in{'dir'}";
  98. local ($newdb) = ($in->{'db'} =~ s/^\*//);
  99. return { 'db' => $in->{'db'},
  100. 'newdb' => $newdb,
  101. 'dir' => $dir,
  102. 'path' => $in->{'dir_def'} ? "/" : "/$in->{'dir'}",
  103. 'forcehttps' => $in->{'forcehttps'}, };
  104. }
  105. }
  106. # script_dolibarr_check(&domain, version, &opts, &upgrade-info)
  107. # Returns an error message if a required option is missing or invalid
  108. sub script_dolibarr_check
  109. {
  110. local ($d, $ver, $opts, $upgrade) = @_;
  111. $opts->{'dir'} =~ /^\// || return "Missing or invalid install directory";
  112. $opts->{'db'} || return "Missing database";
  113. if (-r "$opts->{'dir'}/conf/conf.php") {
  114. return "Dolibarr appears to be already installed in the selected directory";
  115. }
  116. local ($dbtype, $dbname) = split(/_/, $opts->{'db'}, 2);
  117. local $clash = &find_database_table($dbtype, $dbname, "llx_.*");
  118. $clash && return "Dolibarr appears to be already using the selected database (table $clash)";
  119. return undef;
  120. }
  121. # script_dolibarr_files(&domain, version, &opts, &upgrade-info)
  122. # Returns a list of files needed by dolibarr, each of which is a hash ref
  123. # containing a name, filename and URL
  124. sub script_dolibarr_files
  125. {
  126. local ($d, $ver, $opts, $upgrade) = @_;
  127. local @files = ( { 'name' => "source",
  128. 'file' => "Dolibarr_$ver.tar.gz",
  129. 'url' => "http://www.dolibarr.fr/files/stable/dolibarr-$ver.tar.gz" } );
  130. return @files;
  131. }
  132. sub script_dolibarr_commands
  133. {
  134. return ("tar", "gunzip");
  135. }
  136. # script_dolibarr_install(&domain, version, &opts, &files, &upgrade-info)
  137. # Actually installs joomla, and returns either 1 and an informational
  138. # message, or 0 and an error
  139. sub script_dolibarr_install
  140. {
  141. local ($d, $version, $opts, $files, $upgrade, $domuser, $dompass) = @_;
  142. local ($out, $ex);
  143. if ($opts->{'newdb'} && !$upgrade) {
  144. local $err = &create_script_database($d, $opts->{'db'});
  145. return (0, "Database creation failed : $err") if ($err);
  146. }
  147. local ($dbtype, $dbname) = split(/_/, $opts->{'db'}, 2);
  148. local $dbuser = $dbtype eq "mysql" ? &mysql_user($d) : &postgres_user($d);
  149. local $dbpass = $dbtype eq "mysql" ? &mysql_pass($d) : &postgres_pass($d, 1);
  150. local $dbphptype = $dbtype eq "mysql" ? "mysqli" : "pgsql";
  151. local $dbhost = &get_database_host($dbtype);
  152. local $dberr = &check_script_db_connection($dbtype, $dbname, $dbuser, $dbpass);
  153. return (0, "Database connection failed : $dberr") if ($dberr);
  154. # Extract tar file to temp dir and copy to target
  155. local $temp = &transname();
  156. local $err = &extract_script_archive($files->{'source'}, $temp, $d,
  157. $opts->{'dir'}, undef);
  158. $err && return (0, "Failed to extract source : $err");
  159. # Add config file
  160. local $cfiledir = "$opts->{'dir'}/conf/";
  161. local $docdir = "$opts->{'dir'}/documents";
  162. local $altdir = "$opts->{'dir'}/custom";
  163. local $cfile = $cfiledir."conf.php";
  164. local $oldcfile = &transname();
  165. local $olddocdir = &transname();
  166. local $oldaltdir = &transname();
  167. local $url;
  168. $tmpl = &get_template($d->{'template'});
  169. $mycharset = $tmpl->{'mysql_charset'};
  170. $mycollate = $tmpl->{'mysql_collate'};
  171. $pgcharset = $tmpl->{'postgres_encoding'};
  172. $charset = $dbtype eq "mysql" ? $mycharset : $pgcharset;
  173. $collate = $dbtype eq "mysql" ? $mycollate : "C";
  174. $path = &script_path_url($d, $opts);
  175. if ($path =~ /^https:/ || $d->{'ssl'}) {
  176. $url = "https://$d->{'dom'}";
  177. }
  178. else {
  179. $url = "http://$d->{'dom'}";
  180. }
  181. if ($opts->{'path'} =~ /\w/) {
  182. $url .= $opts->{'path'};
  183. }
  184. if (!$upgrade) {
  185. local $cdef = "$opts->{'dir'}/conf/conf.php.example";
  186. &run_as_domain_user($d, "cp ".quotemeta($cdef)." ".quotemeta($cfile));
  187. &set_ownership_permissions(undef, undef, 0777, $cfiledir);
  188. &set_ownership_permissions(undef, undef, 0666, $cfile);
  189. &run_as_domain_user($d, "mkdir ".quotemeta($docdir));
  190. &set_ownership_permissions(undef, undef, 0777, $docdir);
  191. &run_as_domain_user($d, "mkdir ".quotemeta($altdir));
  192. &set_ownership_permissions(undef, undef, 0777, $altdir);
  193. }
  194. else {
  195. # Preserve old config file, documents and custom directory
  196. &copy_source_dest($cfile, $oldcfile);
  197. &copy_source_dest($docdir, $olddocdir);
  198. &copy_source_dest($altdir, $oldaltdir);
  199. }
  200. if ($upgrade) {
  201. # Put back original config file, documents and custom directory
  202. &copy_source_dest_as_domain_user($d, $oldcfile, $cfile);
  203. &copy_source_dest_as_domain_user($d, $olddocdir, $docdir);
  204. &copy_source_dest_as_domain_user($d, $oldaltdir, $altdir);
  205. # First page (Update database schema)
  206. local @params = ( [ "action", "upgrade" ],
  207. [ "versionfrom", $upgrade->{'version'} ],
  208. [ "versionto", $ver ],
  209. );
  210. local $err = &call_dolibarr_wizard_page(\@params, "upgrade", $d, $opts);
  211. return (-1, "Dolibarr wizard failed : $err") if ($err);
  212. # Second page (Migrate some data)
  213. local @params = ( [ "action", "upgrade" ],
  214. [ "versionfrom", $upgrade->{'version'} ],
  215. [ "versionto", $ver ],
  216. );
  217. local $err = &call_dolibarr_wizard_page(\@params, "upgrade2", $d, $opts);
  218. return (-1, "Dolibarr wizard failed : $err") if ($err);
  219. # Third page (Update version number)
  220. local @params = ( [ "action", "upgrade" ],
  221. [ "versionfrom", $upgrade->{'version'} ],
  222. [ "versionto", $ver ],
  223. );
  224. local $err = &call_dolibarr_wizard_page(\@params, "etape5", $d, $opts);
  225. return (-1, "Dolibarr wizard failed : $err") if ($err);
  226. # Remove the installation directory.
  227. local $dinstall = "$opts->{'dir'}/install";
  228. $dinstall =~ s/\/$//;
  229. $out = &run_as_domain_user($d, "rm -rf ".quotemeta($dinstall));
  230. }
  231. else {
  232. # First page (Db connection and config file creation)
  233. local @params = ( [ "main_dir", $opts->{'dir'} ],
  234. [ "main_data_dir", $opts->{'dir'}."/documents" ],
  235. [ "main_url", $url ],
  236. [ "db_type", $dbphptype ],
  237. [ "db_host", $dbhost ],
  238. [ "db_name", $dbname ],
  239. [ "db_user", $dbuser ],
  240. [ "db_pass", $dbpass ],
  241. [ "action", "set" ],
  242. [ "main_force_https", $opts->{'forcehttps'} ],
  243. [ "dolibarr_main_db_character_set", $charset ],
  244. [ "dolibarr_main_db_collation", $collate ],
  245. [ "usealternaterootdir", "1" ],
  246. [ "main_alt_dir_name", "custom" ],
  247. );
  248. local $err = &call_dolibarr_wizard_page(\@params, "etape1", $d, $opts);
  249. return (-1, "Dolibarr wizard failed : $err") if ($err);
  250. # Second page (Populate database)
  251. local @params = ( [ "action", "set" ] );
  252. local $err = &call_dolibarr_wizard_page(\@params, "etape2", $d, $opts);
  253. return (-1, "Dolibarr wizard failed : $err") if ($err);
  254. # Third page (Add administrator account)
  255. local @params = ( [ "action", "set" ],
  256. [ "login", "admin" ],
  257. [ "pass", $dompass ],
  258. [ "pass_verif", $dompass ],
  259. );
  260. local $err = &call_dolibarr_wizard_page(\@params, "etape5", $d, $opts);
  261. return (-1, "Dolibarr wizard failed : $err") if ($err);
  262. # Remove the installation directory and protect config file.
  263. local $dinstall = "$opts->{'dir'}/install";
  264. $dinstall =~ s/\/$//;
  265. $out = &run_as_domain_user($d, "rm -rf ".quotemeta($dinstall));
  266. &set_ownership_permissions(undef, undef, 0644, $cfile);
  267. &set_ownership_permissions(undef, undef, 0755, $cfiledir);
  268. }
  269. # Return a URL for the user
  270. local $rp = $opts->{'dir'};
  271. $rp =~ s/^$d->{'home'}\///;
  272. local $adminurl = $url;
  273. 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);
  274. }
  275. # call_dolibarr_wizard_page(&parameters, step-no, &domain, &opts)
  276. sub call_dolibarr_wizard_page
  277. {
  278. local ($params, $page, $d, $opts) = @_;
  279. local $params = join("&", map { $_->[0]."=".&urlize($_->[1]) } @$params );
  280. local $ipage = $opts->{'path'}."/install/".$page.".php";
  281. local ($iout, $ierror);
  282. &post_http_connection($d, $ipage, $params, \$iout, \$ierror);
  283. if ($ierror) {
  284. return $ierror;
  285. }
  286. return undef;
  287. }
  288. # script_dolibarr_uninstall(&domain, version, &opts)
  289. # Un-installs a dolibarr installation, by deleting the directory.
  290. # Returns 1 on success and a message, or 0 on failure and an error
  291. sub script_dolibarr_uninstall
  292. {
  293. local ($d, $version, $opts) = @_;
  294. # Remove the contents of the target directory
  295. local $derr = &delete_script_install_directory($d, $opts);
  296. return (0, $derr) if ($derr);
  297. # Remove all llx_ tables from the database
  298. # 3 times because of constraints
  299. &cleanup_script_database($d, $opts->{'db'}, "llx_");
  300. &cleanup_script_database($d, $opts->{'db'}, "llx_");
  301. &cleanup_script_database($d, $opts->{'db'}, "llx_");
  302. # Take out the DB
  303. if ($opts->{'newdb'}) {
  304. &delete_script_database($d, $opts->{'db'});
  305. }
  306. return (1, "Dolibarr directory and tables deleted.");
  307. }
  308. # script_dolibarr_latest(version)
  309. # Returns a URL and regular expression or callback func to get the version
  310. sub script_dolibarr_latest
  311. {
  312. local ($ver) = @_;
  313. if ($ver >= 3.0) {
  314. return ( "http://www.dolibarr.fr/files/stable/",
  315. "dolibarr\\-(3\\.[0-9\\.]+)" );
  316. }
  317. return ( );
  318. }
  319. sub script_dolibarr_site
  320. {
  321. return 'http://www.dolibarr.org/';
  322. }
  323. sub script_dolibarr_passmode
  324. {
  325. return 2;
  326. }
  327. 1;