finally working async framework
[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);
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 @EXPORT_OK = qw( passwd );
16
17 $socket =  "/usr/local/freeside/selfservice_socket";
18
19 $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin';
20 $ENV{'SHELL'} = '/bin/sh';
21 $ENV{'IFS'} = " \t\n";
22 $ENV{'CDPATH'} = '';
23 $ENV{'ENV'} = '';
24 $ENV{'BASH_ENV'} = '';
25
26 my $freeside_uid = scalar(getpwnam('freeside'));
27 die "not running as the freeside user\n" if $> != $freeside_uid;
28
29 =head1 NAME
30
31 FS::SelfService - Freeside self-service API
32
33 =head1 SYNOPSIS
34
35 =head1 DESCRIPTION
36
37 Use this API to implement your own client "self-service" module.
38
39 If you just want to customize the look of the existing "self-service" module,
40 see XXXX instead.
41
42 =head1 FUNCTIONS
43
44 =over 4
45
46 =item passwd
47
48 Returns the empty value on success, or an error message on errors.
49
50 =cut
51
52 sub passwd {
53   my $param;
54   if ( ref($_[0]) ) {
55     $param = shift;
56   } else {
57     $param = { @_ };
58   }
59
60   $param->{_packet} = 'passwd';
61
62   simple_packet($param);
63 }
64
65 sub simple_packet {
66   my $packet = shift;
67   socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
68   connect(SOCK, sockaddr_un($socket)) or die "connect: $!";
69   nstore_fd($packet, \*SOCK) or die "can't send packet: $!";
70   SOCK->flush;
71
72   #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
73
74   #block until there is a message on socket
75 #  my $w = new IO::Select;
76 #  $w->add(\*SOCK);
77 #  my @wait = $w->can_read;
78   my $return = fd_retrieve(\*SOCK) or die "error reading result: $!";
79   die $return->{'_error'} if defined $return->{_error} && $return->{_error};
80
81   $return->{'error'};
82 }
83
84 =back
85
86 =head1 BUGS
87
88 =head1 SEE ALSO
89
90 L<freeside-selfservice-clientd>, L<freeside-selfservice-server>
91
92 =cut
93
94 1;
95