processing payments...
[freeside.git] / fs_selfservice / FS-SelfService / SelfService.pm
1 package FS::SelfService;
2
3 use strict;
4 use vars qw($VERSION @ISA @EXPORT_OK $socket %autoload );
5 use Exporter;
6 use Socket;
7 use FileHandle;
8 #use IO::Handle;
9 use IO::Select;
10 use Storable qw(nstore_fd fd_retrieve);
11
12 $VERSION = '0.03';
13
14 @ISA = qw( Exporter );
15
16 $socket =  "/usr/local/freeside/selfservice_socket";
17
18 %autoload = (
19   'passwd'        => 'passwd/passwd',
20   'chfn'          => 'passwd/passwd',
21   'chsh'          => 'passwd/passwd',
22   'login'         => 'MyAccount/login',
23   'customer_info' => 'MyAccount/customer_info',
24   'invoice'       => 'MyAccount/invoice',
25   'cancel'        => 'MyAccount/cancel',
26   'payment_info'  => 'MyAccount/payment_info',
27 );
28 @EXPORT_OK = keys %autoload;
29
30 $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin';
31 $ENV{'SHELL'} = '/bin/sh';
32 $ENV{'IFS'} = " \t\n";
33 $ENV{'CDPATH'} = '';
34 $ENV{'ENV'} = '';
35 $ENV{'BASH_ENV'} = '';
36
37 my $freeside_uid = scalar(getpwnam('freeside'));
38 die "not running as the freeside user\n" if $> != $freeside_uid;
39
40 =head1 NAME
41
42 FS::SelfService - Freeside self-service API
43
44 =head1 SYNOPSIS
45
46 =head1 DESCRIPTION
47
48 Use this API to implement your own client "self-service" module.
49
50 If you just want to customize the look of the existing "self-service" module,
51 see XXXX instead.
52
53 =head1 FUNCTIONS
54
55 =over 4
56
57 =item passwd
58
59 Returns the empty value on success, or an error message on errors.
60
61 =cut
62
63 foreach my $autoload ( keys %autoload ) {
64
65   my $eval =
66   "sub $autoload { ". '
67                    my $param;
68                    if ( ref($_[0]) ) {
69                      $param = shift;
70                    } else {
71                      $param = { @_ };
72                    }
73
74                    $param->{_packet} = \''. $autoload{$autoload}. '\';
75
76                    simple_packet($param);
77                  }';
78
79   eval $eval;
80   die $@ if $@;
81
82 }
83
84 sub simple_packet {
85   my $packet = shift;
86   socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
87   connect(SOCK, sockaddr_un($socket)) or die "connect: $!";
88   nstore_fd($packet, \*SOCK) or die "can't send packet: $!";
89   SOCK->flush;
90
91   #shoudl trap: Magic number checking on storable file failed at blib/lib/Storable.pm (autosplit into blib/lib/auto/Storable/fd_retrieve.al) line 337, at /usr/local/share/perl/5.6.1/FS/SelfService.pm line 71
92
93   #block until there is a message on socket
94 #  my $w = new IO::Select;
95 #  $w->add(\*SOCK);
96 #  my @wait = $w->can_read;
97   my $return = fd_retrieve(\*SOCK) or die "error reading result: $!";
98   die $return->{'_error'} if defined $return->{_error} && $return->{_error};
99
100   $return;
101 }
102
103 =back
104
105 =head1 BUGS
106
107 =head1 SEE ALSO
108
109 L<freeside-selfservice-clientd>, L<freeside-selfservice-server>
110
111 =cut
112
113 1;
114