diff options
Diffstat (limited to 'FS')
24 files changed, 939 insertions, 560 deletions
| diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index d00bf5782..5941935ba 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -1,7 +1,7 @@  package FS::part_export;  use strict; -use vars qw( @ISA @EXPORT_OK %exports ); +use vars qw( @ISA @EXPORT_OK $DEBUG %exports );  use Exporter;  use Tie::IxHash;  use FS::Record qw( qsearch qsearchs dbh ); @@ -12,6 +12,8 @@ use FS::export_svc;  @ISA = qw(FS::Record);  @EXPORT_OK = qw(export_info); +$DEBUG = 0; +  =head1 NAME  FS::part_export - Object methods for part_export records @@ -303,7 +305,7 @@ sub part_svc {  =item svc_x -Returns a list of associate FS::svc_* records. +Returns a list of associated FS::svc_* records.  =cut @@ -530,545 +532,48 @@ sub export_info {  #  '';  #} -tie my %sysvshell_options, 'Tie::IxHash', -  'crypt' => { label=>'Password encryption', -               type=>'select', options=>[qw(crypt md5)], -               default=>'crypt', -             }, -; - -tie my %bsdshell_options, 'Tie::IxHash',  -  'crypt' => { label=>'Password encryption', -               type=>'select', options=>[qw(crypt md5)], -               default=>'crypt', -             }, -; - -tie my %shellcommands_options, 'Tie::IxHash', -  #'machine' => { label=>'Remote machine' }, -  'user' => { label=>'Remote username', default=>'root' }, -  'useradd' => { label=>'Insert command', -                 default=>'useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username' -                #default=>'cp -pr /etc/skel $dir; chown -R $uid.$gid $dir' -               }, -  'useradd_stdin' => { label=>'Insert command STDIN', -                       type =>'textarea', -                       default=>'', -                     }, -  'userdel' => { label=>'Delete command', -                 default=>'userdel -r $username', -                 #default=>'rm -rf $dir', -               }, -  'userdel_stdin' => { label=>'Delete command STDIN', -                       type =>'textarea', -                       default=>'', -                     }, -  'usermod' => { label=>'Modify command', -                 default=>'usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username', -                #default=>'[ -d $old_dir ] && mv $old_dir $new_dir || ( '. -                 #  'chmod u+t $old_dir; mkdir $new_dir; cd $old_dir; '. -                 #  'find . -depth -print | cpio -pdm $new_dir; '. -                 #  'chmod u-t $new_dir; chown -R $uid.$gid $new_dir; '. -                 #  'rm -rf $old_dir'. -                 #')' -               }, -  'usermod_stdin' => { label=>'Modify command STDIN', -                       type =>'textarea', -                       default=>'', -                     }, -  'usermod_pwonly' => { label=>'Disallow username changes', -                        type =>'checkbox', -                      }, -  'suspend' => { label=>'Suspension command', -                 default=>'usermod -L $username', -               }, -  'suspend_stdin' => { label=>'Suspension command STDIN', -                       default=>'', -                     }, -  'unsuspend' => { label=>'Unsuspension command', -                   default=>'usermod -U $username', -                 }, -  'unsuspend_stdin' => { label=>'Unsuspension command STDIN', -                         default=>'', -                       }, -; - -tie my %shellcommands_withdomain_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'useradd' => { label=>'Insert command', -                 #default=>'' -               }, -  'useradd_stdin' => { label=>'Insert command STDIN', -                       type =>'textarea', -                       #default=>"$_password\n$_password\n", -                     }, -  'userdel' => { label=>'Delete command', -                 #default=>'', -               }, -  'userdel_stdin' => { label=>'Delete command STDIN', -                       type =>'textarea', -                       #default=>'', -                     }, -  'usermod' => { label=>'Modify command', -                 default=>'', -               }, -  'usermod_stdin' => { label=>'Modify command STDIN', -                       type =>'textarea', -                       #default=>"$_password\n$_password\n", -                     }, -  'usermod_pwonly' => { label=>'Disallow username changes', -                        type =>'checkbox', -                      }, -  'suspend' => { label=>'Suspension command', -                 default=>'', -               }, -  'suspend_stdin' => { label=>'Suspension command STDIN', -                       default=>'', -                     }, -  'unsuspend' => { label=>'Unsuspension command', -                   default=>'', -                 }, -  'unsuspend_stdin' => { label=>'Unsuspension command STDIN', -                         default=>'', -                       }, -; - -tie my %www_shellcommands_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'useradd' => { label=>'Insert command', -                 default=>'mkdir /var/www/$zone; chown $username /var/www/$zone; ln -s /var/www/$zone $homedir/$zone', -               }, -  'userdel'  => { label=>'Delete command', -                  default=>'[ -n "$zone" ] && rm -rf /var/www/$zone; rm $homedir/$zone', -                }, -  'usermod'  => { label=>'Modify command', -                  default=>'[ -n "$old_zone" ] && rm $old_homedir/$old_zone; [ "$old_zone" != "$new_zone" -a -n "$new_zone" ] && mv /var/www/$old_zone /var/www/$new_zone; [ "$old_username" != "$new_username" ] && chown -R $new_username /var/www/$new_zone; ln -s /var/www/$new_zone $new_homedir/$new_zone', -                }, -; - -tie my %apache_options, 'Tie::IxHash', -  'user'       => { label=>'Remote username', default=>'root' }, -  'httpd_conf' => { label=>'httpd.conf snippet location', -                    default=>'/etc/apache/httpd-freeside.conf', }, -  'template'   => { -    label   => 'Template', -    type    => 'textarea', -    default => <<'END', -<VirtualHost $domain> #generic -#<VirtualHost ip.addr> #preferred, http://httpd.apache.org/docs/dns-caveats.html -DocumentRoot /var/www/$zone -ServerName $zone -ServerAlias *.$zone -#BandWidthModule On -#LargeFileLimit 4096 12288 -</VirtualHost> - -END -  }, -; - -tie my %domain_shellcommands_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'useradd' => { label=>'Insert command', -                 default=>'', -               }, -  'userdel'  => { label=>'Delete command', -                  default=>'', -                }, -  'usermod'  => { label=>'Modify command', -                  default=>'', -                }, -; - -tie my %textradius_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'users' => { label=>'users file location', default=>'/etc/raddb/users' }, -; - -tie my %sqlradius_options, 'Tie::IxHash', -  'datasrc'  => { label=>'DBI data source ' }, -  'username' => { label=>'Database username' }, -  'password' => { label=>'Database password' }, -  'ignore_accounting' => { -     type => 'checkbox', -     label=>'Ignore accounting records from this database' -  }, -; - -tie my %sqlradius_withdomain_options, 'Tie::IxHash', -  'datasrc'  => { label=>'DBI data source ' }, -  'username' => { label=>'Database username' }, -  'password' => { label=>'Database password' }, -  'ignore_accounting' => { -     type => 'checkbox', -     label=>'Ignore accounting records from this database' -  }, -; - -tie my %cyrus_options, 'Tie::IxHash', -  'server' => { label=>'IMAP server' }, -  'username' => { label=>'Admin username' }, -  'password' => { label=>'Admin password' }, -; - -tie my %cp_options, 'Tie::IxHash', -  'port'      => { label=>'Port number' }, -  'username'  => { label=>'Username' }, -  'password'  => { label=>'Password' }, -  'domain'    => { label=>'Domain' }, -  'workgroup' => { label=>'Default Workgroup' }, -; - -tie my %infostreet_options, 'Tie::IxHash', -  'url'      => { label=>'XML-RPC Access URL', }, -  'login'    => { label=>'InfoStreet login', }, -  'password' => { label=>'InfoStreet password', }, -  'groupID'  => { label=>'InfoStreet groupID', }, -; - -tie my %vpopmail_options, 'Tie::IxHash', -  #'machine' => { label=>'vpopmail machine', }, -  'dir'     => { label=>'directory', }, # ?more info? default? -  'uid'     => { label=>'vpopmail uid' }, -  'gid'     => { label=>'vpopmail gid' }, -  'restart' => { label=> 'vpopmail restart command', -                 default=> 'cd /home/vpopmail/domains; for domain in *; do /home/vpopmail/bin/vmkpasswd $domain; done; /var/qmail/bin/qmail-newu; killall -HUP qmail-send', -               }, -; - -tie my %communigate_pro_options, 'Tie::IxHash', -  'port'     => { label=>'Port number', default=>'106', }, -  'login'    => { label=>'The administrator account name.  The name can contain a domain part.', }, -  'password' => { label=>'The administrator account password.', }, -  'accountType' => { label=>'Type for newly-created accounts', -                     type=>'select', -                     options=>[qw( MultiMailbox TextMailbox MailDirMailbox )], -                     default=>'MultiMailbox', -                   }, -  'externalFlag' => { label=> 'Create accounts with an external (visible for legacy mailers) INBOX.', -                      type=>'checkbox', -                    }, -  'AccessModes' => { label=>'Access modes', -                     default=>'Mail POP IMAP PWD WebMail WebSite', -                   }, -; - -tie my %communigate_pro_singledomain_options, 'Tie::IxHash', -  'port'     => { label=>'Port number', default=>'106', }, -  'login'    => { label=>'The administrator account name.  The name can contain a domain part.', }, -  'password' => { label=>'The administrator account password.', }, -  'domain'   => { label=>'Domain', }, -  'accountType' => { label=>'Type for newly-created accounts', -                     type=>'select', -                     options=>[qw( MultiMailbox TextMailbox MailDirMailbox )], -                     default=>'MultiMailbox', -                   }, -  'externalFlag' => { label=> 'Create accounts with an external (visible for legacy mailers) INBOX.', -                      type=>'checkbox', -                    }, -  'AccessModes' => { label=>'Access modes', -                     default=>'Mail POP IMAP PWD WebMail WebSite', -                   }, -; - -tie my %bind_options, 'Tie::IxHash', -  #'machine'    => { label=>'named machine' }, -  'named_conf' => { label  => 'named.conf location', -                    default=> '/etc/bind/named.conf' }, -  'zonepath'   => { label => 'path to zone files', -                    default=> '/etc/bind/', }, -; - -tie my %bind_slave_options, 'Tie::IxHash', -  #'machine'    => { label=> 'Slave machine' }, -  'master'      => { label=> 'Master IP address(s) (semicolon-separated)' }, -  'named_conf'  => { label   => 'named.conf location', -                     default => '/etc/bind/named.conf' }, -; - -tie my %http_options, 'Tie::IxHash', -  'method' => { label   =>'Method', -                type    =>'select', -                #options =>[qw(POST GET)], -                options =>[qw(POST)], -                default =>'POST' }, -  'url'    => { label   => 'URL', default => 'http://', }, -  'insert_data' => { -    label   => 'Insert data', -    type    => 'textarea', -    default => join("\n", -      'DomainName $svc_x->domain', -      'Email ( grep { $_ ne "POST" } $svc_x->cust_svc->cust_pkg->cust_main->invoicing_list)[0]', -      'test 1', -      'reseller $svc_x->cust_svc->cust_pkg->part_pkg->pkg =~ /reseller/i', -    ), -  }, -  'delete_data' => { -    label   => 'Delete data', -    type    => 'textarea', -    default => join("\n", -    ), -  }, -  'replace_data' => { -    label   => 'Replace data', -    type    => 'textarea', -    default => join("\n", -    ), -  }, -; - -tie my %sqlmail_options, 'Tie::IxHash', -  'datasrc'  => { label=>'DBI data source' }, -  'username' => { label=>'Database username' }, -  'password' => { label=>'Database password' }, -; - -tie my %ldap_options, 'Tie::IxHash', -  'dn'         => { label=>'Root DN' }, -  'password'   => { label=>'Root DN password' }, -  'userdn'     => { label=>'User DN' }, -  'attributes' => { label=>'Attributes', -                    type=>'textarea', -                    default=>join("\n", -                      'uid $username', -                      'mail $username\@$domain', -                      'uidno $uid', -                      'gidno $gid', -                      'cn $first', -                      'sn $last', -                      'mailquota $quota', -                      'vmail', -                      'location', -                      'mailtag', -                      'mailhost', -                      'mailmessagestore $dir', -                      'userpassword $crypt_password', -                      'hint', -                      'answer $sec_phrase', -                      'objectclass top,person,inetOrgPerson', -                    ), -                  }, -  'radius'     => { label=>'Export RADIUS attributes', type=>'checkbox', }, -; - -tie my %forward_shellcommands_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'useradd' => { label=>'Insert command', -                 default=>'', -               }, -  'userdel'  => { label=>'Delete command', -                  default=>'', -                }, -  'usermod'  => { label=>'Modify command', -                  default=>'', -                }, -; - -tie my %postfix_options, 'Tie::IxHash', -  'user' => { label=>'Remote username', default=>'root' }, -  'aliases' => { label=>'aliases file location', default=>'/etc/aliases' }, -  'virtual' => { label=>'virtual file location', default=>'/etc/postfix/virtual' }, -  'mydomain' => { label=>'local domain', default=>'' }, -; - -#export names cannot have dashes... -%exports = ( -  'svc_acct' => { -    'sysvshell' => { -      'desc' => -        'Batch export of /etc/passwd and /etc/shadow files (Linux/SysV).', -      'options' => \%sysvshell_options, -      'nodomain' => 'Y', -      'notes' => 'MD5 crypt requires installation of <a href="http://search.cpan.org/search?dist=Crypt-PasswdMD5">Crypt::PasswdMD5</a> from CPAN.    Run bin/sysvshell.export to export the files.', -    }, -    'bsdshell' => { -      'desc' => -        'Batch export of /etc/passwd and /etc/master.passwd files (BSD).', -      'options' => \%bsdshell_options, -      'nodomain' => 'Y', -      'notes' => 'MD5 crypt requires installation of <a href="http://search.cpan.org/search?dist=Crypt-PasswdMD5">Crypt::PasswdMD5</a> from CPAN.  Run bin/bsdshell.export to export the files.', -    }, -#    'nis' => { -#      'desc' => -#        'Batch export of /etc/global/passwd and /etc/global/shadow for NIS ', -#      'options' => {}, -#    }, -    'textradius' => { -      'desc' => 'Real-time export to a text /etc/raddb/users file (Livingston, Cistron)', -      'options' => \%textradius_options, -      'notes' => 'This will edit a text RADIUS users file in place on a remote server.  Requires installation of <a href="http://search.cpan.org/search?dist=RADIUS-UserFile">RADIUS::UserFile</a> from CPAN.  If using RADIUS::UserFile 1.01, make sure to apply <a href="http://rt.cpan.org/NoAuth/Bug.html?id=1210">this patch</a>.  Also make sure <a href="http://rsync.samba.org/">rsync</a> is installed on the remote machine, and <a href="../docs/ssh.html">SSH is setup for unattended operation</a>.', -    }, - -    'shellcommands' => { -      'desc' => 'Real-time export via remote SSH (i.e. useradd, userdel, etc.)', -      'options' => \%shellcommands_options, -      'nodomain' => 'Y', -      'notes' => 'Run remote commands via SSH.  Usernames are considered unique (also see shellcommands_withdomain).  You probably want this if the commands you are running will not accept a domain as a parameter.  You will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a>.<BR><BR>Use these buttons for some useful presets:<UL><LI><INPUT TYPE="button" VALUE="Linux" onClick=\'this.form.useradd.value = "useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username"; this.form.useradd_stdin.value = ""; this.form.userdel.value = "userdel -r $username"; this.form.userdel_stdin.value=""; this.form.usermod.value = "usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username"; this.form.usermod_stdin.value = ""; this.form.suspend.value = "usermod -L $username"; this.form.suspend_stdin.value=""; this.form.unsuspend.value = "usermod -U $username"; this.form.unsuspend_stdin.value="";\'><LI><INPUT TYPE="button" VALUE="FreeBSD" onClick=\'this.form.useradd.value = "lockf /etc/passwd.lock pw useradd $username -d $dir -m -s $shell -u $uid -g $gid -c $finger -h 0"; this.form.useradd_stdin.value = "$_password\n"; this.form.userdel.value = "lockf /etc/passwd.lock pw userdel $username -r"; this.form.userdel_stdin.value=""; this.form.usermod.value = "lockf /etc/passwd.lock pw usermod $old_username -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -c $new_finger -h 0"; this.form.usermod_stdin.value = "$new__password\n"; this.form.suspend.value = "lockf /etc/passwd.lock pw lock $username"; this.form.suspend_stdin.value=""; this.form.unsuspend.value = "lockf /etc/passwd.lock pw unlock $username"; this.form.unsuspend_stdin.value="";\'> Note: On FreeBSD, due to deficient locking in pw(1), you must disable the chpass(1), chsh(1), chfn(1), passwd(1), and vipw(1) commands, or replace them with wrappers that prepend "lockf /etc/passwd.lock".  Alternatively, apply the patch in <A HREF="http://www.freebsd.org/cgi/query-pr.cgi?pr=23501">FreeBSD PR#23501</A> and remove the "lockf /etc/passwd.lock" from these default commands.<LI><INPUT TYPE="button" VALUE="NetBSD/OpenBSD" onClick=\'this.form.useradd.value = "useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username"; this.form.useradd_stdin.value = ""; this.form.userdel.value = "userdel -r $username"; this.form.userdel_stdin.value=""; this.form.usermod.value = "usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username"; this.form.usermod_stdin.value = ""; this.form.suspend.value = ""; this.form.suspend_stdin.value=""; this.form.unsuspend.value = ""; this.form.unsuspend_stdin.value="";\'><LI><INPUT TYPE="button" VALUE="Just maintain directories (use with sysvshell or bsdshell)" onClick=\'this.form.useradd.value = "cp -pr /etc/skel $dir; chown -R $uid.$gid $dir"; this.form.useradd_stdin.value = ""; this.form.usermod.value = "[ -d $old_dir ] && mv $old_dir $new_dir || ( chmod u+t $old_dir; mkdir $new_dir; cd $old_dir; find . -depth -print | cpio -pdm $new_dir; chmod u-t $new_dir; chown -R $new_uid.$new_gid $new_dir; rm -rf $old_dir )"; this.form.usermod_stdin.value = ""; this.form.userdel.value = "rm -rf $dir"; this.form.userdel_stdin.value=""; this.form.suspend.value = ""; this.form.suspend_stdin.value=""; this.form.unsuspend.value = ""; this.form.unsuspend_stdin.value="";\'></UL>The following variables are available for interpolation (prefixed with new_ or old_ for replace operations): <UL><LI><code>$username</code><LI><code>$_password</code><LI><code>$quoted_password</code> - unencrypted password quoted for the shell<LI><code>$crypt_password</code> - encrypted password<LI><code>$uid</code><LI><code>$gid</code><LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes)<LI><code>$dir</code> - home directory<LI><code>$shell</code><LI><code>$quota</code><LI>All other fields in <a href="../docs/schema.html#svc_acct">svc_acct</a> are also available.</UL>', -    }, - -    'shellcommands_withdomain' => { -      'desc' => 'Real-time export via remote SSH (vpopmail, etc.).', -      'options' => \%shellcommands_withdomain_options, -      'notes' => 'Run remote commands via SSH.  username@domain (rather than just usernames) are considered unique (also see shellcommands).  You probably want this if the commands you are running will accept a domain as a parameter, and will allow the same username with different domains.  You will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a>.<BR><BR>Use these buttons for some useful presets:<UL><LI><INPUT TYPE="button" VALUE="vpopmail" onClick=\'this.form.useradd.value = "/home/vpopmail/bin/vadduser $username\\\@$domain $quoted_password"; this.form.useradd_stdin.value = ""; this.form.userdel.value = "/home/vpopmail/bin/vdeluser $username\\\@$domain"; this.form.userdel_stdin.value=""; this.form.usermod.value = "/home/vpopmail/bin/vpasswd $new_username\\\@$new_domain $new_quoted_password"; this.form.usermod_stdin.value = ""; this.form.usermod_pwonly.checked = true;\'></UL>The following variables are available for interpolation (prefixed with <code>new_</code> or <code>old_</code> for replace operations): <UL><LI><code>$username</code><LI><code>$domain</code><LI><code>$_password</code><LI><code>$quoted_password</code> - unencrypted password quoted for the shell<LI><code>$crypt_password</code> - encrypted password<LI><code>$uid</code><LI><code>$gid</code><LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes)<LI><code>$dir</code> - home directory<LI><code>$shell</code><LI><code>$quota</code><LI>All other fields in <a href="../docs/schema.html#svc_acct">svc_acct</a> are also available.</UL>', -    }, - -    'ldap' => { -      'desc' => 'Real-time export to LDAP', -      'options' => \%ldap_options, -      'notes' => 'Real-time export to arbitrary LDAP attributes.  Requires installation of <a href="http://search.cpan.org/search?dist=Net-LDAP">Net::LDAP</a> from CPAN.', -    }, - -    'sqlradius' => { -      'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator)', -      'options' => \%sqlradius_options, -      'nodomain' => 'Y', -      'notes' => 'Real-time export of radcheck, radreply and usergroup tables to any SQL database for <a href="http://www.freeradius.org/">FreeRADIUS</a>, <a href="http://radius.innercite.com/">ICRADIUS</a> or <a href="http://www.open.com.au/radiator/">Radiator</a>.  This export does not export RADIUS realms (see also sqlradius_withdomain).  An existing RADIUS database will be updated in realtime, but you can use <a href="../docs/man/bin/freeside-sqlradius-reset">freeside-sqlradius-reset</a> to delete the entire RADIUS database and repopulate the tables from the Freeside database.  See the <a href="http://search.cpan.org/doc/TIMB/DBI/DBI.pm#connect">DBI documentation</a> and the <a href="http://search.cpan.org/search?mode=module&query=DBD%3A%3A">documentation for your DBD</a> for the exact syntax of a DBI data source.<ul><li>Using FreeRADIUS 0.9.0 with the PostgreSQL backend, the db_postgresql.sql schema and postgresql.conf queries contain incompatible changes.  This is fixed in 0.9.1.  Only new installs with 0.9.0 and PostgreSQL are affected - upgrades and other database backends and versions are unaffected.<li>Using ICRADIUS, add a dummy "op" column to your database: <blockquote><code>ALTER TABLE radcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radgroupcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radgroupreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'</code></blockquote><li>Using Radiator, see the <a href="http://www.open.com.au/radiator/faq.html#38">Radiator FAQ</a> for configuration information.</ul>', -    }, - -    'sqlradius_withdomain' => { -      'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator) with realms', -      'options' => \%sqlradius_withdomain_options, -      'nodomain' => '', -      'notes' => 'Real-time export of radcheck, radreply and usergroup tables to any SQL database for <a href="http://www.freeradius.org/">FreeRADIUS</a>, <a href="http://radius.innercite.com/">ICRADIUS</a> or <a href="http://www.open.com.au/radiator/">Radiator</a>.  This export exports domains to RADIUS realms (see also sqlradius).  An existing RADIUS database will be updated in realtime, but you can use <a href="../docs/man/bin/freeside-sqlradius-reset">freeside-sqlradius-reset</a> to delete the entire RADIUS database and repopulate the tables from the Freeside database.  See the <a href="http://search.cpan.org/doc/TIMB/DBI/DBI.pm#connect">DBI documentation</a> and the <a href="http://search.cpan.org/search?mode=module&query=DBD%3A%3A">documentation for your DBD</a> for the exact syntax of a DBI data source.<ul><li>Using FreeRADIUS 0.9.0 with the PostgreSQL backend, the db_postgresql.sql schema and postgresql.conf queries contain incompatible changes.  This is fixed in 0.9.1.  Only new installs with 0.9.0 and PostgreSQL are affected - upgrades and other database backends and versions are unaffected.<li>Using ICRADIUS, add a dummy "op" column to your database: <blockquote><code>ALTER TABLE radcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radgroupcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'<br>ALTER TABLE radgroupreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT \'==\'</code></blockquote><li>Using Radiator, see the <a href="http://www.open.com.au/radiator/faq.html#38">Radiator FAQ</a> for configuration information.</ul>', -    }, - -    'sqlmail' => { -      'desc' => 'Real-time export to SQL-backed mail server', -      'options' => \%sqlmail_options, -      'nodomain' => 'Y', -      'notes' => 'Database schema can be made to work with Courier IMAP and Exim.  Others could work but are untested. (...extended description from pc-intouch?...)', -    }, - -    'cyrus' => { -      'desc' => 'Real-time export to Cyrus IMAP server', -      'options' => \%cyrus_options, -      'nodomain' => 'Y', -      'notes' => 'Integration with <a href="http://asg.web.cmu.edu/cyrus/imapd/">Cyrus IMAP Server</a>.  Cyrus::IMAP::Admin should be installed locally and the connection to the server secured.  <B>svc_acct.quota</B>, if available, is used to set the Cyrus quota. ' -    }, - -    'cp' => { -      'desc' => 'Real-time export to Critical Path Account Provisioning Protocol', -      'options' => \%cp_options, -      'notes' => 'Real-time export to <a href="http://www.cp.net/">Critial Path Account Provisioning Protocol</a>.  Requires installation of <a href="http://search.cpan.org/search?dist=Net-APP">Net::APP</a> from CPAN.', -    }, -     -    'infostreet' => { -      'desc' => 'Real-time export to InfoStreet streetSmartAPI', -      'options' => \%infostreet_options, -      'nodomain' => 'Y', -      'notes' => 'Real-time export to <a href="http://www.infostreet.com/">InfoStreet</a> streetSmartAPI.  Requires installation of <a href="http://search.cpan.org/search?dist=Frontier-Client">Frontier::Client</a> from CPAN.', -    }, - -    'vpopmail' => { -      'desc' => 'Real-time export to vpopmail text files', -      'options' => \%vpopmail_options, -      'notes' => 'Real time export to <a href="http://inter7.com/vpopmail/">vpopmail</a> text files.  <a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> must be installed, and you will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a> to <b>vpopmail</b>@<i>export.host</i>.', -    }, - -    'communigate_pro' => { -      'desc' => 'Real-time export to a CommuniGate Pro mail server', -      'options' => \%communigate_pro_options, -      'notes' => 'Real time export to a <a href="http://www.stalker.com/CommuniGatePro/">CommuniGate Pro</a> mail server.  The <a href="http://www.stalker.com/CGPerl/">CommuniGate Pro Perl Interface</a> must be installed as CGP::CLI.', -    }, - -    'communigate_pro_singledomain' => { -      'desc' => 'Real-time export to a CommuniGate Pro mail server, one domain only', -      'options' => \%communigate_pro_singledomain_options, -      'nodomain' => 'Y', -      'notes' => 'Real time export to a <a href="http://www.stalker.com/CommuniGatePro/">CommuniGate Pro</a> mail server.  This is an unusual export to CommuniGate Pro that forces all accounts into a single domain.  As CommuniGate Pro supports multiple domains, unless you have a specific reason for using this export, you probably want to use the communigate_pro export instead.  The <a href="http://www.stalker.com/CGPerl/">CommuniGate Pro Perl Interface</a> must be installed as CGP::CLI.', -    }, - -  }, - -  'svc_domain' => { - -    'bind' => { -      'desc' =>'Batch export to BIND named', -      'options' => \%bind_options, -      'notes' => 'Batch export of BIND zone and configuration files to primary nameserver.  <a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> must be installed.  Run bin/bind.export to export the files.', -    }, - -    'bind_slave' => { -      'desc' =>'Batch export to slave BIND named', -      'options' => \%bind_slave_options, -      'notes' => 'Batch export of BIND configuration file to a secondary nameserver.  Zones are slaved from the listed masters.  <a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> must be installed.  Run bin/bind.export to export the files.', -    }, - -    'http' => { -      'desc' => 'Send an HTTP or HTTPS GET or POST request', -      'options' => \%http_options, -      'notes' => 'Send an HTTP or HTTPS GET or POST to the specified URL.  <a href="http://search.cpan.org/search?dist=libwww-perl">libwww-perl</a> must be installed.  For HTTPS support, <a href="http://search.cpan.org/search?dist=Crypt-SSLeay">Crypt::SSLeay</a> or <a href="http://search.cpan.org/search?dist=IO-Socket-SSL">IO::Socket::SSL</a> is required.', -    }, - -    'sqlmail' => { -      'desc' => 'Real-time export to SQL-backed mail server', -      'options' => \%sqlmail_options, -      #'nodomain' => 'Y', -      'notes' => 'Database schema can be made to work with Courier IMAP and Exim.  Others could work but are untested. (...extended description from pc-intouch?...)', -    }, - -    'domain_shellcommands' => { -      'desc' => 'Run remote commands via SSH, for domains.', -      'options' => \%domain_shellcommands_options, -      'notes'    => 'Run remote commands via SSH, for domains.  You will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a>.<BR><BR>Use these buttons for some useful presets:<UL><LI><INPUT TYPE="button" VALUE="qmail catchall .qmail-domain-default maintenance" onClick=\'this.form.useradd.value = "[ \"$uid\" -a \"$gid\" -a \"$dir\" -a \"$qdomain\" ] && [ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }"; this.form.userdel.value = ""; this.form.usermod.value = "";\'></UL>The following variables are available for interpolation (prefixed with <code>new_</code> or <code>old_</code> for replace operations): <UL><LI><code>$domain</code><LI><code>$qdomain</code> - domain with periods replaced by colons<LI><code>$uid</code> - of catchall account<LI><code>$gid</code> - of catchall account<LI><code>$dir</code> - home directory of catchall account<LI>All other fields in <a href="../docs/schema.html#svc_domain">svc_domain</a> are also available.</UL>', -    }, - - -  }, - -  'svc_acct_sm' => {}, - -  'svc_forward' => { -    'sqlmail' => { -      'desc' => 'Real-time export to SQL-backed mail server', -      'options' => \%sqlmail_options, -      #'nodomain' => 'Y', -      'notes' => 'Database schema can be made to work with Courier IMAP and Exim.  Others could work but are untested. (...extended description from fire2wire?...)', -    }, - -    'forward_shellcommands' => { -      'desc' => 'Run remote commands via SSH, for forwards', -      'options' => \%forward_shellcommands_options, -      'notes' => 'Run remote commands via SSH, for forwards.  You will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a>.<BR><BR>Use these buttons for some useful presets:<UL><LI><INPUT TYPE="button" VALUE="text vpopmail maintenance" onClick=\'this.form.useradd.value = "[ -d /home/vpopmail/domains/$domain/$username ] && { echo \"$destination\" > /home/vpopmail/domains/$domain/$username/.qmail; chown vpopmail:vchkpw /home/vpopmail/domains/$domain/$username/.qmail; }"; this.form.userdel.value = "rm /home/vpopmail/domains/$domain/$username/.qmail"; this.form.usermod.value = "mv /home/vpopmail/domains/$old_domain/$old_username/.qmail /home/vpopmail/domains/$new_domain/$new_username; [ \"$old_destination\" != \"$new_destination\" ] && { echo \"$new_destination\" > /home/vpopmail/domains/$new_domain/$new_username/.qmail; chown vpopmail:vchkpw /home/vpopmail/domains/$new_domain/$new_username/.qmail; }";\'></UL>The following variables are available for interpolation (prefixed with <code>new_</code> or <code>old_</code> for replace operations): <UL><LI><code>$username</code><LI><code>$domain</code><LI><code>$destination</code> - forward destination<LI>All other fields in <a href="../docs/schema.html#svc_forward">svc_forward</a> are also available.</UL>', -    }, - -    'postfix' => { -      'desc' => 'Real-time export to Postfix text files', -      'options' => \%postfix_options, -      #'nodomain' => 'Y', -      'notes' => 'Batch export of Postfix aliases and virtual files.  <a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> must be installed.  Run bin/postfix.export to export the files.', -    }, - -  }, - -  'svc_www' => { -    'www_shellcommands' => { -      'desc' => 'Run remote commands via SSH, for virtual web sites.', -      'options' => \%www_shellcommands_options, -      'notes'    => 'Run remote commands via SSH, for virtual web sites.  You will need to <a href="../docs/ssh.html">setup SSH for unattended operation</a>.<BR><BR>The following variables are available for interpolation (prefixed with <code>new_</code> or <code>old_</code> for replace operations): <UL><LI><code>$zone</code><LI><code>$username</code><LI><code>$homedir</code><LI>All other fields in <a href="../docs/schema.html#svc_www">svc_www</a> are also available.</UL>', -    }, - -    'apache' => { -      'desc' => 'Export an Apache httpd.conf file snippet.', -      'options' => \%apache_options, -      'notes' => 'Batch export of an httpd.conf snippet from a template.  Typically used with something like <code>Include /etc/apache/httpd-freeside.conf</code> in httpd.conf.  <a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> must be installed.  Run bin/apache.export to export the files.', -    }, -  }, - -); +foreach my $INC ( @INC ) { +  foreach my $file ( glob("$INC/FS/part_export/*.pm") ) { +    warn "attempting to load export info from $file\n" if $DEBUG; +    $file =~ /\/(\w+)\.pm$/ or do { +      warn "unrecognized file in $INC/FS/part_export/: $file\n"; +      next; +    }; +    my $mod = $1; +    my $info = eval "use FS::part_export::$mod; ". +                    "\\%FS::part_export::$mod\::info;"; +    if ( $@ ) { +      die "error using FS::part_export::$mod (skipping): $@\n" if $@; +      next; +    } +    unless ( keys %$info ) { +      warn "no %info hash found in FS::part_export::$mod, skipping\n" +        unless $mod =~ /^(passwdfile|null)$/; #hack but what the heck +      next; +    } +    warn "got export info from FS::part_export::$mod: $info\n" if $DEBUG; +    no strict 'refs'; +    foreach my $svc ( +      ref($info->{'svc'}) ? @{$info->{'svc'}} : $info->{'svc'} +    ) { +      unless ( $svc ) { +        warn "blank svc for FS::part_export::$mod (skipping)\n"; +        next; +      } +      $exports{$svc}->{$mod} = $info; +    } +  } +}  =back  =head1 NEW EXPORT CLASSES -Should be added to the %export hash here, and a module should be added in -FS/FS/part_export/ (an example may be found in eg/export_template.pm) +A module should be added in FS/FS/part_export/ (an example may be found in +eg/export_template.pm)  =head1 BUGS -All the stuff in the %exports hash should be generated from the specific -export modules. -  Hmm... cust_export class (not necessarily a database table...) ... ?  deprecated column... diff --git a/FS/FS/part_export/apache.pm b/FS/FS/part_export/apache.pm index 9161d72b3..b16b3040d 100644 --- a/FS/FS/part_export/apache.pm +++ b/FS/FS/part_export/apache.pm @@ -1,7 +1,43 @@  package FS::part_export::apache; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::null;  @ISA = qw(FS::part_export::null); +tie my %options, 'Tie::IxHash', +  'user'       => { label=>'Remote username', default=>'root' }, +  'httpd_conf' => { label=>'httpd.conf snippet location', +                    default=>'/etc/apache/httpd-freeside.conf', }, +  'template'   => { +    label   => 'Template', +    type    => 'textarea', +    default => <<'END', +<VirtualHost $domain> #generic +#<VirtualHost ip.addr> #preferred, http://httpd.apache.org/docs/dns-caveats.html +DocumentRoot /var/www/$zone +ServerName $zone +ServerAlias *.$zone +#BandWidthModule On +#LargeFileLimit 4096 12288 +</VirtualHost> + +END +  }, +; + +%info = ( +  'svc'     => 'svc_www', +  'desc'    => 'Export an Apache httpd.conf file snippet.', +  'options' => \%options, +  'notes'   => <<'END' +Batch export of an httpd.conf snippet from a template.  Typically used with +something like <code>Include /etc/apache/httpd-freeside.conf</code> in +httpd.conf.  <a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a> +must be installed.  Run bin/apache.export to export the files. +END +); + +1; + diff --git a/FS/FS/part_export/bind.pm b/FS/FS/part_export/bind.pm index b72c9bdb0..cf73ef450 100644 --- a/FS/FS/part_export/bind.pm +++ b/FS/FS/part_export/bind.pm @@ -1,7 +1,34 @@  package FS::part_export::bind; -use vars qw(@ISA); +use vars qw(@ISA %info %options); +use Tie::IxHash;  use FS::part_export::null;  @ISA = qw(FS::part_export::null); +tie %options, 'Tie::IxHash', +  'named_conf'   => { label  => 'named.conf location', +                      default=> '/etc/bind/named.conf' }, +  'zonepath'     => { label => 'path to zone files', +                      default=> '/etc/bind/', }, +  'bind_release' => { label => 'ISC BIND Release', +                      type  => 'select', +                      options => [qw(BIND8 BIND9)], +                      default => 'BIND8' }, +  'bind9_minttl' => { label => 'The minttl required by bind9 and RFC1035.', +                      default => '1D' }, +; + +%info = ( +  'svc'     => 'svc_domain', +  'desc'    => 'Batch export to BIND named', +  'options' => \%options, +  'notes'   => <<'END' +Batch export of BIND zone and configuration files to a primary nameserver. +<a href="http://search.cpan.org/search?dist=File-Rsync">File::Rsync</a> +must be installed.  Run bin/bind.export to export the files. +END +); + +1; + diff --git a/FS/FS/part_export/bind_slave.pm b/FS/FS/part_export/bind_slave.pm index ebb29c1d7..c89325f8d 100644 --- a/FS/FS/part_export/bind_slave.pm +++ b/FS/FS/part_export/bind_slave.pm @@ -1,7 +1,28 @@  package FS::part_export::bind_slave; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::null;  @ISA = qw(FS::part_export::null); +tie my %options, 'Tie::IxHash',  +  'master'       => { label=> 'Master IP address(s) (semicolon-separated)' }, +  %FS::part_export::bind::options, +; +delete $options{'zonepath'}; + +%info = ( +  'svc'     => 'svc_domain', +  'desc'    =>'Batch export to slave BIND named', +  'options' => \%options, +  'notes'   => <<'END' +Batch export of BIND configuration file to a secondary nameserver.  Zones are +slaved from the listed masters. +<a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a> +must be installed.  Run bin/bind.export to export the files. +END +); + +1; + diff --git a/FS/FS/part_export/bsdshell.pm b/FS/FS/part_export/bsdshell.pm index 06642097f..7b5feb252 100644 --- a/FS/FS/part_export/bsdshell.pm +++ b/FS/FS/part_export/bsdshell.pm @@ -1,7 +1,25 @@  package FS::part_export::bsdshell; -use vars qw(@ISA); -use FS::part_export::null; +use vars qw(@ISA %info); +use Tie::IxHash; +use FS::part_export::passwdfile; -@ISA = qw(FS::part_export::null); +@ISA = qw(FS::part_export::passwdfile); + +tie my %options, 'Tie::IxHash', %FS::part_export::passwdfile::options; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => +    'Batch export of /etc/passwd and /etc/master.passwd files (BSD)', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => <<'END' +MD5 crypt requires installation of +<a href="http://search.cpan.org/dist/Crypt-PasswdMD5">Crypt::PasswdMD5</a> +from CPAN.  Run bin/bsdshell.export to export the files. +END +); + +1; diff --git a/FS/FS/part_export/communigate_pro.pm b/FS/FS/part_export/communigate_pro.pm index 557aad91d..6da201799 100644 --- a/FS/FS/part_export/communigate_pro.pm +++ b/FS/FS/part_export/communigate_pro.pm @@ -1,11 +1,42 @@  package FS::part_export::communigate_pro; -use vars qw(@ISA); +use vars qw(@ISA %info %options); +use Tie::IxHash;  use FS::part_export;  use FS::queue;  @ISA = qw(FS::part_export); +tie %options, 'Tie::IxHash', +  'port'     => { label=>'Port number', default=>'106', }, +  'login'    => { label=>'The administrator account name.  The name can contain a domain part.', }, +  'password' => { label=>'The administrator account password.', }, +  'accountType' => { label=>'Type for newly-created accounts', +                     type=>'select', +                     options=>[qw( MultiMailbox TextMailbox MailDirMailbox )], +                     default=>'MultiMailbox', +                   }, +  'externalFlag' => { label=> 'Create accounts with an external (visible for legacy mailers) INBOX.', +                      type=>'checkbox', +                    }, +  'AccessModes' => { label=>'Access modes', +                     default=>'Mail POP IMAP PWD WebMail WebSite', +                   }, +; + +%info = ( +  'svc'     => 'svc_acct', +  'desc'    => 'Real-time export to a CommuniGate Pro mail server', +  'options' => \%options, +  'notes'   => <<'END' +Real time export to a +<a href="http://www.stalker.com/CommuniGatePro/">CommuniGate Pro</a> +mail server.  The +<a href="http://www.stalker.com/CGPerl/">CommuniGate Pro Perl Interface</a> +must be installed as CGP::CLI. +END +); +  sub rebless { shift; }  sub export_username { @@ -142,3 +173,6 @@ sub communigate_pro_command { #subroutine, not method    $cli->Logout or die "Can't logout of CGPro: $CGP::ERR_STRING\n";  } + +1; + diff --git a/FS/FS/part_export/communigate_pro_singledomain.pm b/FS/FS/part_export/communigate_pro_singledomain.pm index 11574af9b..6a1bf60eb 100644 --- a/FS/FS/part_export/communigate_pro_singledomain.pm +++ b/FS/FS/part_export/communigate_pro_singledomain.pm @@ -1,11 +1,37 @@  package FS::part_export::communigate_pro_singledomain; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::communigate_pro;  @ISA = qw(FS::part_export::communigate_pro); +tie my %options, 'Tie::IxHash', %FS::part_export::communigate_pro::options, +  'domain'   => { label=>'Domain', }, +; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => +    'Real-time export to a CommuniGate Pro mail server, one domain only', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => <<'END' +Real time export to a +<a href="http://www.stalker.com/CommuniGatePro/">CommuniGate Pro</a> +mail server.  This is an unusual export to CommuniGate Pro that forces all +accounts into a single domain.  As CommuniGate Pro supports multipledomains, +unless you have a specific reason for using this export, you probably want to +use the communigate_pro export instead.  The +<a href="http://www.stalker.com/CGPerl/">CommuniGate Pro Perl Interface</a> +must be installed as CGP::CLI. +END +); +  sub export_username {    my($self, $svc_acct) = (shift, shift);    $svc_acct->username. '@'. $self->option('domain');  } + +1; + diff --git a/FS/FS/part_export/cp.pm b/FS/FS/part_export/cp.pm index c4750dd5d..a295c574b 100644 --- a/FS/FS/part_export/cp.pm +++ b/FS/FS/part_export/cp.pm @@ -1,10 +1,32 @@  package FS::part_export::cp; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'port'      => { label=>'Port number' }, +  'username'  => { label=>'Username' }, +  'password'  => { label=>'Password' }, +  'domain'    => { label=>'Domain' }, +  'workgroup' => { label=>'Default Workgroup' }, +; + +%info = ( +  'svc'    => 'svc_acct', +  'desc'   => 'Real-time export to Critical Path Account Provisioning Protocol', +  'options'=> \%options, +  'notes'  => <<'END' +Real-time export to +<a href="http://www.cp.net/">Critial Path Account Provisioning Protocol</a>. +Requires installation of +<a href="http://search.cpan.org/dist/Net-APP">Net::APP</a> +from CPAN. +END +); +  sub rebless { shift; }  sub _export_insert { @@ -134,3 +156,5 @@ sub cp_command { #subroutine, not method  } +1; + diff --git a/FS/FS/part_export/cyrus.pm b/FS/FS/part_export/cyrus.pm index 110ff198f..84c9e5a30 100644 --- a/FS/FS/part_export/cyrus.pm +++ b/FS/FS/part_export/cyrus.pm @@ -1,10 +1,31 @@  package FS::part_export::cyrus; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'server'   => { label=>'IMAP server' }, +  'username' => { label=>'Admin username' }, +  'password' => { label=>'Admin password' }, +; + +%info = (  +  'svc'      => 'svc_acct', +  'desc'     => 'Real-time export to Cyrus IMAP server', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => <<'END' +Integration with +<a href="http://asg.web.cmu.edu/cyrus/imapd/">Cyrus IMAP Server</a>. +Cyrus::IMAP::Admin should be installed locally and the connection to the +server secured.  <B>svc_acct.quota</B>, if available, is used to set the +Cyrus quota. +END +); +  sub rebless { shift; }  sub _export_insert { @@ -95,4 +116,5 @@ sub cyrus_connect {  #sub cyrus_replace { #subroutine, not method  #} +1; diff --git a/FS/FS/part_export/domain_shellcommands.pm b/FS/FS/part_export/domain_shellcommands.pm index d295eece0..d8ae0c376 100644 --- a/FS/FS/part_export/domain_shellcommands.pm +++ b/FS/FS/part_export/domain_shellcommands.pm @@ -1,11 +1,54 @@  package FS::part_export::domain_shellcommands;  use strict; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'useradd' => { label=>'Insert command', +                 default=>'', +               }, +  'userdel'  => { label=>'Delete command', +                  default=>'', +                }, +  'usermod'  => { label=>'Modify command', +                  default=>'', +                }, +; + +%info = ( +  'svc'     => 'svc_domain', +  'desc'    => 'Run remote commands via SSH, for domains.', +  'options' => \%options, +  'notes'   => <<'END' +Run remote commands via SSH, for domains.  You will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a>. +<BR><BR>Use these buttons for some useful presets: +<UL> +  <LI> +    <INPUT TYPE="button" VALUE="qmail catchall .qmail-domain-default maintenance" onClick=' +      this.form.useradd.value = "[ \"$uid\" -a \"$gid\" -a \"$dir\" -a \"$qdomain\" ] && [ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }"; +      this.form.userdel.value = ""; +      this.form.usermod.value = ""; +    '> +</UL> +The following variables are available for interpolation (prefixed with <code>new_</code> or <code>old_</code> for replace operations): +<UL> +  <LI><code>$domain</code> +  <LI><code>$qdomain</code> - domain with periods replaced by colons +  <LI><code>$uid</code> - of catchall account +  <LI><code>$gid</code> - of catchall account +  <LI><code>$dir</code> - home directory of catchall account +  <LI>All other fields in +    <a href="../docs/schema.html#svc_domain">svc_domain</a> are also available. +</UL> +END +); +  sub rebless { shift; }  sub _export_insert { @@ -108,3 +151,5 @@ sub ssh_cmd { #subroutine, not method  #sub shellcommands_delete { #subroutine, not method  #} +1; + diff --git a/FS/FS/part_export/forward_shellcommands.pm b/FS/FS/part_export/forward_shellcommands.pm index 5d3145715..6908214d5 100644 --- a/FS/FS/part_export/forward_shellcommands.pm +++ b/FS/FS/part_export/forward_shellcommands.pm @@ -1,11 +1,52 @@  package FS::part_export::forward_shellcommands;  use strict; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'useradd' => { label=>'Insert command', +                 default=>'', +               }, +  'userdel'  => { label=>'Delete command', +                  default=>'', +                }, +  'usermod'  => { label=>'Modify command', +                  default=>'', +                }, +; + +%info = ( +  'svc'     => 'svc_forward', +  'desc'    => 'Run remote commands via SSH, for forwards', +  'options' => \%options, +  'notes'   => <<'END' +Run remote commands via SSH, for forwards.  You will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a>. +<BR><BR>Use these buttons for some useful presets: +<UL> +  <LI> +    <INPUT TYPE="button" VALUE="text vpopmail maintenance" onClick=' +      this.form.useradd.value = "[ -d /home/vpopmail/domains/$domain/$username ] && { echo \"$destination\" > /home/vpopmail/domains/$domain/$username/.qmail; chown vpopmail:vchkpw /home/vpopmail/domains/$domain/$username/.qmail; }"; +      this.form.userdel.value = "rm /home/vpopmail/domains/$domain/$username/.qmail"; +      this.form.usermod.value = "mv /home/vpopmail/domains/$old_domain/$old_username/.qmail /home/vpopmail/domains/$new_domain/$new_username; [ \"$old_destination\" != \"$new_destination\" ] && { echo \"$new_destination\" > /home/vpopmail/domains/$new_domain/$new_username/.qmail; chown vpopmail:vchkpw /home/vpopmail/domains/$new_domain/$new_username/.qmail; }"; +    '> +</UL> +The following variables are available for interpolation (prefixed with +<code>new_</code> or <code>old_</code> for replace operations): +<UL> +  <LI><code>$username</code> +  <LI><code>$domain</code> +  <LI><code>$destination</code> - forward destination +  <LI>All other fields in <a href="../docs/schema.html#svc_forward">svc_forward</a> are also available. +</UL> +END +); +  sub rebless { shift; }  sub _export_insert { @@ -108,3 +149,5 @@ sub ssh_cmd { #subroutine, not method  #sub shellcommands_delete { #subroutine, not method  #} +1; + diff --git a/FS/FS/part_export/http.pm b/FS/FS/part_export/http.pm index 0e02f0f8e..0be2a0f36 100644 --- a/FS/FS/part_export/http.pm +++ b/FS/FS/part_export/http.pm @@ -1,10 +1,54 @@  package FS::part_export::http; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'method' => { label   =>'Method', +                type    =>'select', +                #options =>[qw(POST GET)], +                options =>[qw(POST)], +                default =>'POST' }, +  'url'    => { label   => 'URL', default => 'http://', }, +  'insert_data' => { +    label   => 'Insert data', +    type    => 'textarea', +    default => join("\n", +      'DomainName $svc_x->domain', +      'Email ( grep { $_ ne "POST" } $svc_x->cust_svc->cust_pkg->cust_main->invoicing_list)[0]', +      'test 1', +      'reseller $svc_x->cust_svc->cust_pkg->part_pkg->pkg =~ /reseller/i', +    ), +  }, +  'delete_data' => { +    label   => 'Delete data', +    type    => 'textarea', +    default => join("\n", +    ), +  }, +  'replace_data' => { +    label   => 'Replace data', +    type    => 'textarea', +    default => join("\n", +    ), +  }, +; + +%info = ( +  'svc'     => 'svc_domain', +  'desc'    => 'Send an HTTP or HTTPS GET or POST request', +  'options' => \%options, +  'notes'   => <<'END' +Send an HTTP or HTTPS GET or POST to the specified URL.  For HTTPS support, +<a href="http://search.cpan.org/dist/Crypt-SSLeay">Crypt::SSLeay</a> +or <a href="http://search.cpan.org/dist/IO-Socket-SSL">IO::Socket::SSL</a> +is required. +END +); +  sub rebless { shift; }  sub _export_insert { @@ -86,3 +130,5 @@ sub http {  } +1; + diff --git a/FS/FS/part_export/infostreet.pm b/FS/FS/part_export/infostreet.pm index caca7c5e1..309e7ce6f 100644 --- a/FS/FS/part_export/infostreet.pm +++ b/FS/FS/part_export/infostreet.pm @@ -1,11 +1,32 @@  package FS::part_export::infostreet; -use vars qw(@ISA %infostreet2cust_main $DEBUG); +use vars qw(@ISA %info %infostreet2cust_main $DEBUG); +use Tie::IxHash;  use FS::UID qw(dbh);  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'url'      => { label=>'XML-RPC Access URL', }, +  'login'    => { label=>'InfoStreet login', }, +  'password' => { label=>'InfoStreet password', }, +  'groupID'  => { label=>'InfoStreet groupID', }, +; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => 'Real-time export to InfoStreet streetSmartAPI', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => <<'END' +Real-time export to +<a href="http://www.infostreet.com/">InfoStreet</a> streetSmartAPI. +Requires installation of +<a href="http://search.cpan.org/dist/Frontier-Client">Frontier::Client</a> from CPAN. +END +); +  $DEBUG = 0;  %infostreet2cust_main = ( @@ -252,4 +273,5 @@ sub _infostreet_parse { #subroutine, not method    } keys %$arg;  } +1; diff --git a/FS/FS/part_export/ldap.pm b/FS/FS/part_export/ldap.pm index 57fd1f3f4..823d99dbf 100644 --- a/FS/FS/part_export/ldap.pm +++ b/FS/FS/part_export/ldap.pm @@ -1,11 +1,50 @@  package FS::part_export::ldap; -use vars qw(@ISA @saltset); +use vars qw(@ISA %info @saltset); +use Tie::IxHash;  use FS::Record qw( dbh );  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'dn'         => { label=>'Root DN' }, +  'password'   => { label=>'Root DN password' }, +  'userdn'     => { label=>'User DN' }, +  'attributes' => { label=>'Attributes', +                    type=>'textarea', +                    default=>join("\n", +                      'uid $username', +                      'mail $username\@$domain', +                      'uidno $uid', +                      'gidno $gid', +                      'cn $first', +                      'sn $last', +                      'mailquota $quota', +                      'vmail', +                      'location', +                      'mailtag', +                      'mailhost', +                      'mailmessagestore $dir', +                      'userpassword $crypt_password', +                      'hint', +                      'answer $sec_phrase', +                      'objectclass top,person,inetOrgPerson', +                    ), +                  }, +  'radius'     => { label=>'Export RADIUS attributes', type=>'checkbox', }, +; + +%info = ( +  'svc'     => 'svc_acct', +  'desc'    => 'Real-time export to LDAP', +  'options' => \%options, +  'notes'   => <<'END' +Real-time export to arbitrary LDAP attributes.  Requires installation of +<a href="http://search.cpan.org/dist/Net-LDAP">Net::LDAP</a> from CPAN. +END +); +  @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );  sub rebless { shift; } @@ -251,3 +290,5 @@ sub ldap_connect {    $ldap;  } +1; + diff --git a/FS/FS/part_export/postfix.pm b/FS/FS/part_export/postfix.pm index 6d5e449ca..c24cf19a3 100644 --- a/FS/FS/part_export/postfix.pm +++ b/FS/FS/part_export/postfix.pm @@ -1,7 +1,27 @@  package FS::part_export::postfix; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::null;  @ISA = qw(FS::part_export::null); +tie my %options, 'Tie::IxHash', +  'user'    => { label=>'Remote username',       default=>'root' }, +  'aliases' => { label=>'aliases file location', default=>'/etc/aliases' }, +  'virtual' => { label=>'virtual file location', default=>'/etc/postfix/virtual' }, +  'mydomain' => { label=>'local domain', default=>'' }, +; + +%info = ( +  'svc'     => 'svc_forward', +  'desc'    => 'Postfix text files', +  'options' => \%options, +  'notes'   => <<'END' +Batch export of Postfix aliases and virtual files. +<a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a> +must be installed.  Run bin/postfix.export to export the files. +END +); + +1; diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm index 9fad36dad..cee54b488 100644 --- a/FS/FS/part_export/shellcommands.pm +++ b/FS/FS/part_export/shellcommands.pm @@ -1,11 +1,161 @@  package FS::part_export::shellcommands; -use vars qw(@ISA @saltset); +use vars qw(@ISA %info @saltset); +use Tie::IxHash;  use String::ShellQuote;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'useradd' => { label=>'Insert command', +                 default=>'useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username' +                #default=>'cp -pr /etc/skel $dir; chown -R $uid.$gid $dir' +               }, +  'useradd_stdin' => { label=>'Insert command STDIN', +                       type =>'textarea', +                       default=>'', +                     }, +  'userdel' => { label=>'Delete command', +                 default=>'userdel -r $username', +                 #default=>'rm -rf $dir', +               }, +  'userdel_stdin' => { label=>'Delete command STDIN', +                       type =>'textarea', +                       default=>'', +                     }, +  'usermod' => { label=>'Modify command', +                 default=>'usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username', +                #default=>'[ -d $old_dir ] && mv $old_dir $new_dir || ( '. +                 #  'chmod u+t $old_dir; mkdir $new_dir; cd $old_dir; '. +                 #  'find . -depth -print | cpio -pdm $new_dir; '. +                 #  'chmod u-t $new_dir; chown -R $uid.$gid $new_dir; '. +                 #  'rm -rf $old_dir'. +                 #')' +               }, +  'usermod_stdin' => { label=>'Modify command STDIN', +                       type =>'textarea', +                       default=>'', +                     }, +  'usermod_pwonly' => { label=>'Disallow username changes', +                        type =>'checkbox', +                      }, +  'suspend' => { label=>'Suspension command', +                 default=>'usermod -L $username', +               }, +  'suspend_stdin' => { label=>'Suspension command STDIN', +                       default=>'', +                     }, +  'unsuspend' => { label=>'Unsuspension command', +                   default=>'usermod -U $username', +                 }, +  'unsuspend_stdin' => { label=>'Unsuspension command STDIN', +                         default=>'', +                       }, +; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => +    'Real-time export via remote SSH (i.e. useradd, userdel, etc.)', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes' => <<'END' +Run remote commands via SSH.  Usernames are considered unique (also see +shellcommands_withdomain).  You probably want this if the commands you are +running will not accept a domain as a parameter.  You will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a>. + +<BR><BR>Use these buttons for some useful presets: +<UL> +  <LI> +    <INPUT TYPE="button" VALUE="Linux" onClick=' +      this.form.useradd.value = "useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username"; +      this.form.useradd_stdin.value = ""; +      this.form.userdel.value = "userdel -r $username"; +      this.form.userdel_stdin.value=""; +      this.form.usermod.value = "usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username"; +      this.form.usermod_stdin.value = ""; +      this.form.suspend.value = "usermod -L $username"; +      this.form.suspend_stdin.value=""; +      this.form.unsuspend.value = "usermod -U $username"; +      this.form.unsuspend_stdin.value=""; +    '> +  <LI> +    <INPUT TYPE="button" VALUE="FreeBSD before 5.2.1" onClick=' +      this.form.useradd.value = "lockf /etc/passwd.lock pw useradd $username -d $dir -m -s $shell -u $uid -g $gid -c $finger -h 0"; +      this.form.useradd_stdin.value = "$_password\n"; +      this.form.userdel.value = "lockf /etc/passwd.lock pw userdel $username -r"; this.form.userdel_stdin.value=""; +      this.form.usermod.value = "lockf /etc/passwd.lock pw usermod $old_username -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -c $new_finger -h 0"; +      this.form.usermod_stdin.value = "$new__password\n"; this.form.suspend.value = "lockf /etc/passwd.lock pw lock $username"; +      this.form.suspend_stdin.value=""; +      this.form.unsuspend.value = "lockf /etc/passwd.lock pw unlock $username"; this.form.unsuspend_stdin.value=""; +    '> +    Note: On FreeBSD versions before 5.2.1, due to deficient locking in pw(1), +    you must disable the chpass(1), chsh(1), chfn(1), passwd(1), and vipw(1) +    commands, or replace them with wrappers that prepend +    "lockf /etc/passwd.lock".  Alternatively, apply the patch in +    <A HREF="http://www.freebsd.org/cgi/query-pr.cgi?pr=23501">FreeBSD PR#23501</A> +    and use the "FreeBSD 5.2.1 or later" button below. +  <LI> +    <INPUT TYPE="button" VALUE="FreeBSD 5.2.1 or later" onClick=' +      this.form.useradd.value = "pw useradd $username -d $dir -m -s $shell -u $uid -g $gid -c $finger -h 0"; +      this.form.useradd_stdin.value = "$_password\n"; +      this.form.userdel.value = "pw userdel $username -r"; +      this.form.userdel_stdin.value=""; +      this.form.usermod.value = "pw usermod $old_username -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -c $new_finger -h 0"; +      this.form.usermod_stdin.value = "$new__password\n"; +      this.form.suspend.value = "pw lock $username"; +      this.form.suspend_stdin.value=""; +      this.form.unsuspend.value = "pw unlock $username"; +      this.form.unsuspend_stdin.value=""; +    '> +  <LI> +    <INPUT TYPE="button" VALUE="NetBSD/OpenBSD" onClick=' +      this.form.useradd.value = "useradd -c $finger -d $dir -m -s $shell -u $uid -p $crypt_password $username"; +      this.form.useradd_stdin.value = ""; +      this.form.userdel.value = "userdel -r $username"; +      this.form.userdel_stdin.value=""; +      this.form.usermod.value = "usermod -c $new_finger -d $new_dir -m -l $new_username -s $new_shell -u $new_uid -p $new_crypt_password $old_username"; +      this.form.usermod_stdin.value = ""; +      this.form.suspend.value = ""; +      this.form.suspend_stdin.value=""; +      this.form.unsuspend.value = ""; +      this.form.unsuspend_stdin.value=""; +    '> +  <LI> +    <INPUT TYPE="button" VALUE="Just maintain directories (use with sysvshell or bsdshell)" onClick=' +      this.form.useradd.value = "cp -pr /etc/skel $dir; chown -R $uid.$gid $dir"; this.form.useradd_stdin.value = ""; +      this.form.usermod.value = "[ -d $old_dir ] && mv $old_dir $new_dir || ( chmod u+t $old_dir; mkdir $new_dir; cd $old_dir; find . -depth -print | cpio -pdm $new_dir; chmod u-t $new_dir; chown -R $new_uid.$new_gid $new_dir; rm -rf $old_dir )"; +      this.form.usermod_stdin.value = ""; +      this.form.userdel.value = "rm -rf $dir"; +      this.form.userdel_stdin.value=""; +      this.form.suspend.value = ""; +      this.form.suspend_stdin.value=""; +      this.form.unsuspend.value = ""; +      this.form.unsuspend_stdin.value=""; +    '> +</UL> + +The following variables are available for interpolation (prefixed with new_ or +old_ for replace operations): +<UL> +  <LI><code>$username</code> +  <LI><code>$_password</code> +  <LI><code>$quoted_password</code> - unencrypted password quoted for the shell +  <LI><code>$crypt_password</code> - encrypted password +  <LI><code>$uid</code> +  <LI><code>$gid</code> +  <LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes) +  <LI><code>$dir</code> - home directory +  <LI><code>$shell</code> +  <LI><code>$quota</code> +  <LI>All other fields in <a href="../docs/schema.html#svc_acct">svc_acct</a> are also available. +</UL> +END +); +  @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );  sub rebless { shift; } @@ -152,3 +302,5 @@ sub ssh_cmd { #subroutine, not method  #sub shellcommands_delete { #subroutine, not method  #} +1; + diff --git a/FS/FS/part_export/shellcommands_withdomain.pm b/FS/FS/part_export/shellcommands_withdomain.pm index a15c24d88..9dab281fc 100644 --- a/FS/FS/part_export/shellcommands_withdomain.pm +++ b/FS/FS/part_export/shellcommands_withdomain.pm @@ -1,7 +1,92 @@  package FS::part_export::shellcommands_withdomain; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::shellcommands;  @ISA = qw(FS::part_export::shellcommands); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'useradd' => { label=>'Insert command', +                 #default=>'' +               }, +  'useradd_stdin' => { label=>'Insert command STDIN', +                       type =>'textarea', +                       #default=>"$_password\n$_password\n", +                     }, +  'userdel' => { label=>'Delete command', +                 #default=>'', +               }, +  'userdel_stdin' => { label=>'Delete command STDIN', +                       type =>'textarea', +                       #default=>'', +                     }, +  'usermod' => { label=>'Modify command', +                 default=>'', +               }, +  'usermod_stdin' => { label=>'Modify command STDIN', +                       type =>'textarea', +                       #default=>"$_password\n$_password\n", +                     }, +  'usermod_pwonly' => { label=>'Disallow username changes', +                        type =>'checkbox', +                      }, +  'suspend' => { label=>'Suspension command', +                 default=>'', +               }, +  'suspend_stdin' => { label=>'Suspension command STDIN', +                       default=>'', +                     }, +  'unsuspend' => { label=>'Unsuspension command', +                   default=>'', +                 }, +  'unsuspend_stdin' => { label=>'Unsuspension command STDIN', +                         default=>'', +                       }, +; + +%info = ( +  'svc'     => 'svc_acct', +  'desc'    => 'Real-time export via remote SSH (vpopmail, etc.)', +  'options' => \%options, +  'notes'   => <<'END' +Run remote commands via SSH.  username@domain (rather than just usernames) are +considered unique (also see shellcommands).  You probably want this if the +commands you are running will accept a domain as a parameter, and will allow +the same username with different domains.  You will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a>. + +<BR><BR>Use these buttons for some useful presets: +<UL> +  <LI><INPUT TYPE="button" VALUE="vpopmail" onClick=' +    this.form.useradd.value = "/home/vpopmail/bin/vadduser $username\\\@$domain $quoted_password"; +    this.form.useradd_stdin.value = ""; +    this.form.userdel.value = "/home/vpopmail/bin/vdeluser $username\\\@$domain"; this.form.userdel_stdin.value=""; +    this.form.usermod.value = "/home/vpopmail/bin/vpasswd $new_username\\\@$new_domain $new_quoted_password"; +    this.form.usermod_stdin.value = ""; +    this.form.usermod_pwonly.checked = true; +  '> +</UL> + +The following variables are available for interpolation (prefixed with +<code>new_</code> or <code>old_</code> for replace operations): +<UL> +  <LI><code>$username</code> +  <LI><code>$domain</code> +  <LI><code>$_password</code> +  <LI><code>$quoted_password</code> - unencrypted password quoted for the shell +  <LI><code>$crypt_password</code> - encrypted password +  <LI><code>$uid</code> +  <LI><code>$gid</code> +  <LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes) +  <LI><code>$dir</code> - home directory +  <LI><code>$shell</code> +  <LI><code>$quota</code> +  <LI>All other fields in <a href="../docs/schema.html#svc_acct">svc_acct</a> are also available. +</UL> +END +); + +1; + diff --git a/FS/FS/part_export/sqlmail.pm b/FS/FS/part_export/sqlmail.pm index 8ccad3c7e..6d61e0e29 100644 --- a/FS/FS/part_export/sqlmail.pm +++ b/FS/FS/part_export/sqlmail.pm @@ -1,6 +1,7 @@  package FS::part_export::sqlmail; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use Digest::MD5 qw(md5_hex);  use FS::Record qw(qsearchs);  use FS::part_export; @@ -8,6 +9,41 @@ use FS::svc_domain;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'datasrc'            => { label => 'DBI data source' }, +  'username'           => { label => 'Database username' }, +  'password'           => { label => 'Database password' }, +  'server_type'        => { +    label   => 'Server type', +    type    => 'select', +    options => [qw(dovecot_plain dovecot_crypt dovecot_digest_md5 courier_plain +                   courier_crypt)], +    default => ['dovecot_plain'], }, +  'svc_acct_table'     => { label => 'User Table', default => 'user_acct' }, +  'svc_forward_table'  => { label => 'Forward Table', default => 'forward' }, +  'svc_domain_table'   => { label => 'Domain Table', default => 'domain' }, +  'svc_acct_fields'    => { label => 'svc_acct Export Fields', +                            default => 'username _password domsvc svcnum' }, +  'svc_forward_fields' => { label => 'svc_forward Export Fields', +                            default => 'domain svcnum catchall' }, +  'svc_domain_fields'  => { label => 'svc_domain Export Fields', +                            default => 'srcsvc dstsvc dst' }, +  'resolve_dstsvc'     => { label => q{Resolve svc_forward.dstsvc to an email address and store it in dst. (Doesn't require that you also export dstsvc.)}, +                            type => 'checkbox' }, +; + +%info = ( +  'svc'      => [qw( svc_acct svc_domain svc_forward )], +  'desc'     => 'Real-time export to SQL-backed mail server', +  'options'  => \%options, +  'nodomain' => '', +  'notes'    => <<'END' +Database schema can be made to work with Courier IMAP, Exim and Dovecot. +Others could work but are untested.  (more detailed description from +Kristian / fire2wire? ) +END +); +  sub rebless { shift; }  sub _export_insert { @@ -180,3 +216,5 @@ sub update_values {  } +1; + diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm index 8a8f9beba..fd5bb89fd 100644 --- a/FS/FS/part_export/sqlradius.pm +++ b/FS/FS/part_export/sqlradius.pm @@ -1,11 +1,64 @@  package FS::part_export::sqlradius; -use vars qw(@ISA); +use vars qw(@ISA %info %options $notes1 $notes2); +use Tie::IxHash;  use FS::Record qw( dbh );  use FS::part_export;  @ISA = qw(FS::part_export); +tie %options, 'Tie::IxHash', +  'datasrc'  => { label=>'DBI data source ' }, +  'username' => { label=>'Database username' }, +  'password' => { label=>'Database password' }, +  'ignore_accounting' => { +     type => 'checkbox', +     label=>'Ignore accounting records from this database' +  }, +; + +$notes1 = <<'END'; +Real-time export of radcheck, radreply and usergroup tables to any SQL database +for <a href="http://www.freeradius.org/">FreeRADIUS</a>, +<a href="http://radius.innercite.com/">ICRADIUS</a> +or <a href="http://www.open.com.au/radiator/">Radiator</a>.   +END + +$notes2 = <<'END'; +An existing RADIUS database will be updated in realtime, but you can use +<a href="../docs/man/bin/freeside-sqlradius-reset">freeside-sqlradius-reset</a> +to delete the entire RADIUS database and repopulate the tables from the +Freeside database.  See the +<a href="http://search.cpan.org/dist/DBI/DBI.pm#connect">DBI documentation</a> +and the +<a href="http://search.cpan.org/search?mode=module&query=DBD%3A%3A">documentation for your DBD</a> +for the exact syntax of a DBI data source. +<ul> +  <li>Using FreeRADIUS 0.9.0 with the PostgreSQL backend, the db_postgresql.sql schema and postgresql.conf queries contain incompatible changes.  This is fixed in 0.9.1.  Only new installs with 0.9.0 and PostgreSQL are affected - upgrades and other database backends and versions are unaffected. +  <li>Using ICRADIUS, add a dummy "op" column to your database: +    <blockquote><code> +      ALTER TABLE radcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT '=='<br> +      ALTER TABLE radreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT '=='<br> +      ALTER TABLE radgroupcheck ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT '=='<br> +      ALTER TABLE radgroupreply ADD COLUMN op VARCHAR(2) NOT NULL DEFAULT '==' +    </code></blockquote> +  <li>Using Radiator, see the +    <a href="http://www.open.com.au/radiator/faq.html#38">Radiator FAQ</a> +    for configuration information. +</ul> +END + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator)', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => $notes1. +                'This export does not export RADIUS realms (see also '. +                'sqlradius_withdomain).  '. +                $notes2 +); +  sub rebless { shift; }  sub export_username { @@ -280,3 +333,5 @@ sub sqlradius_connect {    DBI->connect(@_) or die $DBI::errstr;  } +1; + diff --git a/FS/FS/part_export/sqlradius_withdomain.pm b/FS/FS/part_export/sqlradius_withdomain.pm index 1c8f38c9d..6130e5eb6 100644 --- a/FS/FS/part_export/sqlradius_withdomain.pm +++ b/FS/FS/part_export/sqlradius_withdomain.pm @@ -1,8 +1,22 @@  package FS::part_export::sqlradius_withdomain; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export::sqlradius; +tie my %options, 'Tie::IxHash', %FS::part_export::sqlradius::options; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator) with realms', +  'options'  => \%options, +  'nodomain' => '', +  'notes' => $FS::part_export::sqlradius::notes1. +             'This export exports domains to RADIUS realms (see also '. +             'sqlradius).  '. +             $FS::part_export::sqlradius::notes2 +); +  @ISA = qw(FS::part_export::sqlradius);  sub export_username { @@ -10,3 +24,5 @@ sub export_username {    $svc_acct->email;  } +1; + diff --git a/FS/FS/part_export/sysvshell.pm b/FS/FS/part_export/sysvshell.pm index f3f6b34b6..244c3bf82 100644 --- a/FS/FS/part_export/sysvshell.pm +++ b/FS/FS/part_export/sysvshell.pm @@ -1,7 +1,25 @@  package FS::part_export::sysvshell; -use vars qw(@ISA); -use FS::part_export::null; +use vars qw(@ISA %info); +use Tie::IxHash; +use FS::part_export::passwdfile; -@ISA = qw(FS::part_export::null); +@ISA = qw(FS::part_export::passwdfile); + +tie my %options, 'Tie::IxHash', %FS::part_export::passwdfile::options; + +%info = ( +  'svc'      => 'svc_acct', +  'desc'     => +    'Batch export of /etc/passwd and /etc/shadow files (Linux, Solaris)', +  'options'  => \%options, +  'nodomain' => 'Y', +  'notes'    => <<'END' +MD5 crypt requires installation of +<a href="http://search.cpan.org/dist/Crypt-PasswdMD5">Crypt::PasswdMD5</a> +from CPAN.    Run bin/sysvshell.export to export the files. +END +); + +1; diff --git a/FS/FS/part_export/textradius.pm b/FS/FS/part_export/textradius.pm index 1492f2672..65936eaf6 100644 --- a/FS/FS/part_export/textradius.pm +++ b/FS/FS/part_export/textradius.pm @@ -1,12 +1,35 @@  package FS::part_export::textradius; -use vars qw(@ISA $prefix); +use vars qw(@ISA %info $prefix);  use Fcntl qw(:flock); +use Tie::IxHash;  use FS::UID qw(datasrc);  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'users' => { label=>'users file location', default=>'/etc/raddb/users' }, +; + +%info = ( +  'svc'     => 'svc_acct', +  'desc'    => +    'Real-time export to a text /etc/raddb/users file (Livingston, Cistron)', +  'options' => \%options, +  'notes'   => <<'END' +This will edit a text RADIUS users file in place on a remote server. +Requires installation of +<a href="http://search.cpan.org/dist/RADIUS-UserFile">RADIUS::UserFile</a> +from CPAN.  If using RADIUS::UserFile 1.01, make sure to apply +<a href="http://rt.cpan.org/NoAuth/Bug.html?id=1210">this patch</a>.  Also +make sure <a href="http://rsync.samba.org/">rsync</a> is installed on the +remote machine, and <a href="../docs/ssh.html">SSH is setup for unattended +operation</a>. +END +); +  $prefix = "/usr/local/etc/freeside/export.";  sub rebless { shift; } @@ -164,3 +187,5 @@ sub textradius_upload {  } +1; + diff --git a/FS/FS/part_export/vpopmail.pm b/FS/FS/part_export/vpopmail.pm index a505a0f47..62fa8bade 100644 --- a/FS/FS/part_export/vpopmail.pm +++ b/FS/FS/part_export/vpopmail.pm @@ -1,13 +1,38 @@  package FS::part_export::vpopmail; -use vars qw(@ISA @saltset $exportdir); +use vars qw(@ISA %info @saltset $exportdir);  use Fcntl qw(:flock); +use Tie::IxHash;  use File::Path;  use FS::UID qw( datasrc );  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  #'machine' => { label=>'vpopmail machine', }, +  'dir'     => { label=>'directory', }, # ?more info? default? +  'uid'     => { label=>'vpopmail uid' }, +  'gid'     => { label=>'vpopmail gid' }, +  'restart' => { label=> 'vpopmail restart command', +                 default=> 'cd /home/vpopmail/domains; for domain in *; do /home/vpopmail/bin/vmkpasswd $domain; done; /var/qmail/bin/qmail-newu; killall -HUP qmail-send', +               }, +; + +%info = ( +  'svc'     => 'svc_acct', +  'desc'    => 'Real-time export to vpopmail text files', +  'options' => \%options, +  'notes'   => <<'END' +Real time export to <a href="http://inter7.com/vpopmail/">vpopmail</a> text +files.  <a href="http://search.cpan.org/dist/File-Rsync">File::Rsync</a> +must be installed, and you will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a> +to <b>vpopmail</b>@<i>export.host</i>.  See shellcommands_withdomain for an +export that uses vpopmail commands instead. +END +); +  @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );  sub rebless { shift; } @@ -223,4 +248,5 @@ sub vpopmail_sync {    ssh("vpopmail\@$machine", $restart) if $restart;  } +1; diff --git a/FS/FS/part_export/www_shellcommands.pm b/FS/FS/part_export/www_shellcommands.pm index 3e0087446..cc1983bf2 100644 --- a/FS/FS/part_export/www_shellcommands.pm +++ b/FS/FS/part_export/www_shellcommands.pm @@ -1,11 +1,45 @@  package FS::part_export::www_shellcommands;  use strict; -use vars qw(@ISA); +use vars qw(@ISA %info); +use Tie::IxHash;  use FS::part_export;  @ISA = qw(FS::part_export); +tie my %options, 'Tie::IxHash', +  'user' => { label=>'Remote username', default=>'root' }, +  'useradd' => { label=>'Insert command', +                 default=>'mkdir /var/www/$zone; chown $username /var/www/$zone; ln -s /var/www/$zone $homedir/$zone', +               }, +  'userdel'  => { label=>'Delete command', +                  default=>'[ -n "$zone" ] && rm -rf /var/www/$zone; rm $homedir/$zone', +                }, +  'usermod'  => { label=>'Modify command', +                  default=>'[ -n "$old_zone" ] && rm $old_homedir/$old_zone; [ "$old_zone" != "$new_zone" -a -n "$new_zone" ] && mv /var/www/$old_zone /var/www/$new_zone; [ "$old_username" != "$new_username" ] && chown -R $new_username /var/www/$new_zone; ln -s /var/www/$new_zone $new_homedir/$new_zone', +                }, +; + +%info = ( +  'svc'     => 'svc_www', +  'desc'    => 'Run remote commands via SSH, for virtual web sites.', +  'options' => \%options, +  'notes'   => <<'END' +Run remote commands via SSH, for virtual web sites.  You will need to +<a href="../docs/ssh.html">setup SSH for unattended operation</a>. +<BR><BR>The following variables are available for interpolation (prefixed with +<code>new_</code> or <code>old_</code> for replace operations): +<UL> +  <LI><code>$zone</code> +  <LI><code>$username</code> +  <LI><code>$homedir</code> +  <LI>All other fields in <a href="../docs/schema.html#svc_www">svc_www</a> +    are also available. +</UL> +END +); + +  sub rebless { shift; }  sub _export_insert { | 
