X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Facct_sql.pm;h=c51ef6836c7e03ae7fdfb7c233f0446d8cccc29f;hp=4b92e80f15b1678fe6d3c9f36b443921ee3b9352;hb=2f3c7f47203f2a1e1590425dc32fd9cf76b6f165;hpb=673b9a458d9138523026963df6fa3b4683e09bae diff --git a/FS/FS/part_export/acct_sql.pm b/FS/FS/part_export/acct_sql.pm index 4b92e80f1..c51ef6836 100644 --- a/FS/FS/part_export/acct_sql.pm +++ b/FS/FS/part_export/acct_sql.pm @@ -1,28 +1,16 @@ package FS::part_export::acct_sql; +use base qw( FS::part_export::sql_Common ); -use vars qw(@ISA %info); +use strict; +use vars qw( %info ); use Tie::IxHash; -#use Digest::MD5 qw(md5_hex); use FS::Record; #qw(qsearchs); -use FS::part_export; -@ISA = qw(FS::part_export); - -tie my %options, 'Tie::IxHash', - 'datasrc' => { label => 'DBI data source' }, - 'username' => { label => 'Database username' }, - 'password' => { label => 'Database password' }, - 'table' => { label => 'Database table' }, - 'schema' => { label => - 'Database schema mapping to Freeside methods.', - type => 'textarea', - }, - 'primary_key' => { label => 'Database primary key' }, - 'crypt' => { label => 'Password encryption', - type=>'select', options=>[qw(crypt md5)], - default=>'crypt', - }, -; +tie my %options, 'Tie::IxHash', %{__PACKAGE__->sql_options}; +$options{'crypt'} = { label => 'Password encryption', + type=>'select', options=>[qw(crypt md5 sha1_base64 sha512)], + default=>'crypt', + }; tie my %vpopmail_map, 'Tie::IxHash', 'pw_name' => 'username', @@ -60,22 +48,76 @@ my $postfix_courierimap_alias_map = join('\n', map "$_ $postfix_courierimap_alias_map{$_}", keys %postfix_courierimap_alias_map ); +tie my %postfix_native_mailbox_map, 'Tie::IxHash', + 'userid' => 'email', + 'uid' => 'uid', + 'gid' => 'gid', + 'password' => 'ldap_password', + 'mail' => 'domain_slash_username', +; +my $postfix_native_mailbox_map = + join('\n', map "$_ $postfix_native_mailbox_map{$_}", + keys %postfix_native_mailbox_map ); + +tie my %libnss_pgsql_passwd_map, 'Tie::IxHash', + 'username' => 'username', + #'passwd' => literal string 'x' + 'uid' => 'uid', + 'gid' => 'gid', + 'gecos' => 'finger', + 'homedir' => 'dir', + 'shell' => 'shell', +; +my $libnss_pgsql_passwd_map = + join('\n', map "$_ $libnss_pgsql_passwd_map{$_}", + keys %libnss_pgsql_passwd_map ); + +tie my %libnss_pgsql_passwd_static, 'Tie::IxHash', + 'passwd' => 'x', +; +my $libnss_pgsql_passwd_static = + join('\n', map "$_ $libnss_pgsql_passwd_static{$_}", + keys %libnss_pgsql_passwd_static ); + +tie my %libnss_pgsql_shadow_map, 'Tie::IxHash', + 'username' => 'username', + 'passwd' => 'crypt_password', +; +my $libnss_pgsql_shadow_map = + join('\n', map "$_ $libnss_pgsql_shadow_map{$_}", + keys %libnss_pgsql_shadow_map ); + +tie my %libnss_pgsql_shadow_static, 'Tie::IxHash', + 'lastchange' => '18550', #not actually implemented.. + 'min' => '0', + 'max' => '99999', + 'warn' => '7', + 'inact' => '0', + 'expire' => '-1', + 'flag' => '0', +; +my $libnss_pgsql_shadow_static = + join('\n', map "$_ $libnss_pgsql_shadow_static{$_}", + keys %libnss_pgsql_shadow_static ); + %info = ( - 'svc' => 'svc_acct', - 'desc' => 'Real-time export of accounts to SQL databases '. - '(vpopmail, Postfix+Courier IMAP, others?)', - 'options' => \%options, - 'nodomain' => '', + 'svc' => 'svc_acct', + 'desc' => 'Real-time export of accounts to SQL databases '. + '(vpopmail, Postfix+Courier IMAP, others?)', + 'options' => \%options, + 'nodomain' => '', + 'no_machine' => 1, + 'default_svc_class' => 'Email', 'notes' => <
In contrast to sqlmail, this is intended to export just svc_acct records only, rather than a single export for svc_acct, svc_forward and svc_domain records, to export in "default" database schemas rather than -configure the MTA or POP/IMAP server for a Freeside-specific schema, and -to be configured for different mail server setups. +configure servers for a Freeside-specific schema, and to be configured for +different mail (and authentication) server setups.

Use these buttons for some useful presets: END ); -sub _map { - my $self = shift; - map { /^\s*(\S+)\s*(\S+)\s*$/ } split("\n", $self->option('schema') ); -} - -sub rebless { shift; } - -sub _export_insert { - my($self, $svc_acct) = (shift, shift); - - my %map = $self->_map; - - my %record = map { my $value = $map{$_}; - my @arg = (); - push @arg, $self->option('crypt') - if $value eq 'crypt_password' && $self->option('crypt'); - $_ => $svc_acct->$value(@arg); - } keys %map; - - my $err_or_queue = - $self->acct_sql_queue( - $svc_acct->svcnum, - 'insert', - $self->option('table'), - %record - ); - return $err_or_queue unless ref($err_or_queue); - - ''; - -} - -sub _export_replace { - my($self, $new, $old) = (shift, shift, shift); - - my %map = $self->_map; - - my @primary_key = (); - if ( $self->option('primary_key') =~ /,/ ) { - foreach my $key ( split(/\s*,\s*/, $self->option('primary_key') ) ) { - my $keymap = $map{$key}; - push @primary_key, $old->$keymap(); - } - } else { - my $keymap = $map{$self->option('primary_key')}; - push @primary_key, $old->$keymap(); - } - - my %record = map { my $value = $map{$_}; - my @arg = (); - push @arg, $self->option('crypt') - if $value eq 'crypt_password' && $self->option('crypt'); - $_ => $new->$value(@arg); - } keys %map; - - my $err_or_queue = $self->acct_sql_queue( - $new->svcnum, - 'replace', - $self->option('table'), - $self->option('primary_key'), @primary_key, - %record, - ); - return $err_or_queue unless ref($err_or_queue); - ''; -} - -sub _export_delete { - my ( $self, $svc_acct ) = (shift, shift); - - my %map = $self->_map; - - my %primary_key = (); - if ( $self->option('primary_key') =~ /,/ ) { - foreach my $key ( split(/\s*,\s*/, $self->option('primary_key') ) ) { - my $keymap = $map{$key}; - $primary_key{ $key } = $svc_acct->$keymap(); - } - } else { - my $keymap = $map{$self->option('primary_key')}; - $primary_key{ $self->option('primary_key') } = $svc_acct->$keymap(), - } - - my $err_or_queue = $self->acct_sql_queue( - $svc_acct->svcnum, - 'delete', - $self->option('table'), - %primary_key, - #$self->option('primary_key') => $svc_acct->$keymap(), - ); - return $err_or_queue unless ref($err_or_queue); - ''; -} - -sub acct_sql_queue { - my( $self, $svcnum, $method ) = (shift, shift, shift); - my $queue = new FS::queue { - 'svcnum' => $svcnum, - 'job' => "FS::part_export::acct_sql::acct_sql_$method", - }; - $queue->insert( - $self->option('datasrc'), - $self->option('username'), - $self->option('password'), - @_, - ) or $queue; -} - -sub acct_sql_insert { #subroutine, not method - my $dbh = acct_sql_connect(shift, shift, shift); - my( $table, %record ) = @_; - - my $sth = $dbh->prepare( - "INSERT INTO $table ( ". join(", ", keys %record). - " ) VALUES ( ". join(", ", map '?', keys %record ). " )" - ) or die $dbh->errstr; - - $sth->execute( values(%record) ) - or die "can't insert into $table table: ". $sth->errstr; - - $dbh->disconnect; -} - -sub acct_sql_delete { #subroutine, not method - my $dbh = acct_sql_connect(shift, shift, shift); - my( $table, %record ) = @_; - - my $sth = $dbh->prepare( - "DELETE FROM $table WHERE ". join(' AND ', map "$_ = ? ", keys %record ) - ) or die $dbh->errstr; - - $sth->execute( map $record{$_}, keys %record ) - or die "can't delete from $table table: ". $sth->errstr; - - $dbh->disconnect; -} - -sub acct_sql_replace { #subroutine, not method - my $dbh = acct_sql_connect(shift, shift, shift); - - my( $table, $pkey ) = ( shift, shift ); - - my %primary_key = (); - if ( $pkey =~ /,/ ) { - foreach my $key ( split(/\s*,\s*/, $pkey ) ) { - $primary_key{$key} = shift; - } - } else { - $primary_key{$pkey} = shift; - } - - my %record = @_; - - my $sth = $dbh->prepare( - "UPDATE $table". - ' SET '. join(', ', map "$_ = ?", keys %record ). - ' WHERE '. join(' AND ', map "$_ = ?", keys %primary_key ) - ) or die $dbh->errstr; - - $sth->execute( values(%record), values(%primary_key) ); - - $dbh->disconnect; -} - -sub acct_sql_connect { - #my($datasrc, $username, $password) = @_; - #DBI->connect($datasrc, $username, $password) or die $DBI::errstr; - DBI->connect(@_) or die $DBI::errstr; +sub _map_arg_callback { + my($self, $field) = @_; + my $crypt = $self->option('crypt'); + return () unless $field eq 'crypt_password' && $crypt; + ($crypt); } 1;