--- /dev/null
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Gearman::Driver;
+use lib '/srv/cloudstore/lib';
+
+BEGIN {
+ $ENV{NAME} ||= $1 if $0 =~ m{([^/]+)$};
+ die "no SLICE in enviroment" unless $ENV{SLICE};
+}
+
+our $log = "$ENV{SLICE}/log/$ENV{NAME}.log",
+
+my $driver = Gearman::Driver->new(
+ namespaces => [qw(CloudStore::Gearman)],
+ configfile => 'config.yaml',
+ loglevel => 'DEBUG',
+ logfile => $log,
+ server => $ENV{GEARMAN} || 'localhost:4730',
+ interval => 3,
+ job_runtime_attributes => {
+ 'CloudStore::Gearman::API::create_user' => {
+ max_processes => 1,
+ min_processes => 1,
+ },
+ },
+);
+
+open(my $pid, '>', "/tmp/$ENV{NAME}.pid");
+print $pid "$$\n";
+close $pid;
+
+warn localtime() . " STARTED $ENV{NAME} pid $$ log $log\n";
+$driver->run;
--- /dev/null
+package CloudStore::Gearman::API;
+use base qw(Gearman::Driver::Worker);
+use Moose;
+
+=head1 NAME
+
+Gearman API workers
+
+=cut
+
+use Data::Dump qw(dump);
+use autodie;
+
+use lib '/srv/cloudstore/lib';
+use CloudStore::API;
+#use WarnColor;
+
+
+use base qw(Gearman::Driver::Worker);
+
+sub prefix { '' } # don't prefix methods with package
+
+sub process_name {
+ my ( $self, $orig, $job_name ) = @_;
+ warn "# process_name $orig $job_name\n";
+ return "$orig ($job_name)";
+}
+
+sub chomp_work {
+ my ($self,$work) = @_;
+ chomp $work;
+ return $work;
+}
+
+our $api = CloudStore::API->new;
+
+=head2 create_user "user_id password quota"
+
+=cut
+
+sub create_user : Job : Decode(chomp_work) : MinProcesses(1) : MaxProcesses(1) {
+ my ( $self, $job, $work ) = @_;
+
+ warn "# create_user [$work]\n";
+ my ( $email, $password, $quota ) = split(/\s+/,$work,3);
+ $quota ||= 200000 && warn "default quota";
+ $api->create_user( $email, $password, $quota );
+}
+
+=head2 send_file ~u2001/from.txt#~u2003/dir/new to.txt
+
+=cut
+
+sub send_file : Job : Decode(chomp_work) : MaxProcesses(2) {
+ my ( $self, $job, $work ) = @_;
+
+ warn "# send_file [$work]\n";
+
+ my ( $from, $to ) = split(/#/,$work,2);
+
+ my $f_uid = $1 if $from =~ s{~(\w+)/}{};
+ my $t_uid = $1 if $to =~ s{~(\w+)/}{};
+
+ warn "send_file $f_uid $from -> $t_uid $to\n";
+
+ $api->send_file( $f_uid => $from, $t_uid => $to );
+}
+
+=head2 rename_file ~u2001/old.txt#new.txt
+
+=cut
+
+sub rename_file : Job : Decode(chomp_work) : MaxProcesses(2) {
+ my ( $self, $job, $work ) = @_;
+
+ warn "# rename_file [$work]\n";
+
+ my ( $from, $to ) = split(/#/,$work,2);
+ my $login = $1 if $from =~ s{~(\w+)/}{};
+ $api->rename_file( $login, $from, $to );
+}
+
+=head2 delete ~u2001/file_or_dir
+
+=cut
+
+sub delete : Job : Decode(chomp_work) : MaxProcesses(2) {
+ my ( $self, $job, $work ) = @_;
+
+ warn "# delete [$work]\n";
+
+ my $login = $1 if $work =~ s{~(\w+)}{};
+ $api->delete( $login, $work );
+
+}
+
+=head2 file_size ~u2001/foo.txt
+
+=cut
+
+sub file_size : Job : Decode(chomp_work) : MaxProcesses(40) {
+ my ( $self, $job, $work ) = @_;
+
+ warn "# file_size [$work]\n";
+
+ my $login = $1 if $work =~ s{~(\w+)}{};
+ $api->file_size( $login, $work );
+}
+
+=head2 user_usage u2001
+
+=cut
+
+sub user_usage : Job : Decode(chomp_work) : MaxProcesses(40) {
+ my ( $self, $job, $work ) = @_;
+ warn "# usage [$work]\n";
+ my $usage = $api->usage( $work );
+ return $usage->{_usage};
+}
+
+1;