From 709521c8921141dcf373fc3c4c31eb8fdb43a4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rainer=20G=C3=BCmpelein?= Date: Sat, 26 Mar 2022 10:19:13 +0100 Subject: [PATCH] sigo client api init --- copri4/main/src/Mod/APIfunc.pm | 35 ++++--- copri4/main/src/Mod/APIsigoclient.pm | 131 +++++++++++++++++++++++++ copri4/main/src/Mod/Pricing.pm | 9 +- copri4/main/src/Tpl/Calorin.pm | 2 +- copri4/main/src/scripts/sigo_client.pl | 35 +++++++ 5 files changed, 193 insertions(+), 19 deletions(-) create mode 100755 copri4/main/src/Mod/APIsigoclient.pm create mode 100755 copri4/main/src/scripts/sigo_client.pl diff --git a/copri4/main/src/Mod/APIfunc.pm b/copri4/main/src/Mod/APIfunc.pm index b418b9f..3fb764e 100755 --- a/copri4/main/src/Mod/APIfunc.pm +++ b/copri4/main/src/Mod/APIfunc.pm @@ -875,8 +875,8 @@ sub booking_update(){ #6 = "canceled"|3 = "occupied"|1 = "available" if($state && $state =~ /$dbt->{copri_conf}->{bike_state}->{6}|$dbt->{copri_conf}->{bike_state}->{3}|$dbt->{copri_conf}->{bike_state}->{1}/ && $record_pos->{cc_id} && $record_pos->{cc_id} > 0){ - #set rent state if lock_system 2=Ilockit - if($record_pos->{int11} eq "2"){ + #set rent state if lock_system 2=Ilockit || 3=sigo + if($record_pos->{int11} && ($record_pos->{int11} == 2 || $record_pos->{int11} == 3)){ my $update_pos = { table => "contenttranspos", #int10 => "$state_key", @@ -1061,7 +1061,7 @@ sub booking_update(){ $update_cc->{txt17} = $Ilockit_GUID if($Ilockit_GUID); } - #end Ilockit + #end Ilockit || sigo }else{ $bw->log("smartlock type not defined, int11:",$record_pos->{int11},""); } @@ -1390,7 +1390,7 @@ sub rentals(){ my $bike_id = $return->{$id}->{bike}; $bike_id = $1 if($bike_id =~ /(\d+)/); #generate always new keys. keep in mind, keys saved in contenttranspos are overwritten - if($withkey && $record->{$id}->{int11} && $record->{$id}->{int11} eq "2"){ + if($withkey && $record->{$id}->{int11} && $record->{$id}->{int11} == 2){ my @K_select = (); @K_select = `cd /var/www/copri4/main/src/scripts && export CLASSPATH='.:/usr/share/java:/usr/share/java/postgresql.jar' && java Ilockauth $varenv{dbname} $bike_id`; $bw->log("rentals java Ilockauth $bike_id | syshost:$varenv{syshost}",\@K_select,""); @@ -1469,21 +1469,25 @@ sub bikes_available(){ $return->{$id}->{description} = Encode::encode('utf-8', Encode::decode('iso-8859-1', $record->{$id}->{txt01})); $return->{$id}->{state} = "$dbt->{copri_conf}->{bike_state}->{$record->{$id}->{int10}}"; $return->{$id}->{bike_charge} = "$record->{$id}->{int19}" if($record->{$id}->{int19}); - $return->{$id}->{system} = "Ilockit"; + $return->{$id}->{lock_state} = "locked" if($record->{$id}->{int20} == 1); + $return->{$id}->{lock_state} = "unlocked" if($record->{$id}->{int20} == 2); + $return->{$id}->{lock_state} = "locking" if($record->{$id}->{int20} == 3); + $return->{$id}->{bike_group} = ["$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$record->{$id}->{main_id}"]; + if($record->{$id}->{int11} eq "2"){ - $return->{$id}->{lock_state} = "locked" if($record->{$id}->{int20} == 1); - $return->{$id}->{lock_state} = "unlocked" if($record->{$id}->{int20} == 2); - $return->{$id}->{lock_state} = "locking" if($record->{$id}->{int20} == 3); + $return->{$id}->{system} = "Ilockit"; $return->{$id}->{Ilockit_GUID} = "$record->{$id}->{txt17}"; $return->{$id}->{Ilockit_ID} = "$record->{$id}->{txt18}"; - $return->{$id}->{bike_group} = ["$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$record->{$id}->{main_id}"]; #if($users_serviceapp->{int09}) #shareetool if($q->param('authcookie') && $dbt->{merchant_ids}->{$varenv->{merchant_id}}->{id} && $dbt->{merchant_ids}->{$varenv->{merchant_id}}->{id} == 187 && scalar(@{$user_tour} >= 1)){ my @service_code = split(/\s/,$record->{$id}->{txt23}); $return->{$id}->{service_code} = [@service_code]; } + }elsif($record->{$id}->{int11} eq "3"){ + $return->{$id}->{system} = "sigo"; } + if(ref($tariff_content) eq "HASH"){ foreach my $tid (sort { $tariff_content->{$a}->{barcode} <=> $tariff_content->{$b}->{barcode} } keys (%$tariff_content)){ $bw->log("bikes_available tariff_content tariff_description $tariff_content->{$tid}->{int12} && $auth->{txt30} =~ /$tariff_content->{$tid}->{barcode}/ BIKE:",$return->{$id}->{bike},""); @@ -1575,19 +1579,22 @@ sub bikes_all(){ $return->{$id}->{state} = "$dbt->{copri_conf}->{bike_state}->{$record->{$id}->{int10}}"; $return->{$id}->{service_state} = "0"; - $return->{$id}->{system} = "Ilockit"; + $return->{$id}->{lock_state} = "locked" if($record->{$id}->{int20} == 1); + $return->{$id}->{lock_state} = "unlocked" if($record->{$id}->{int20} == 2); + $return->{$id}->{lock_state} = "locking" if($record->{$id}->{int20} == 3); + $return->{$id}->{bike_group} = ["$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$record->{$id}->{main_id}"]; + if($record->{$id}->{int11} eq "2"){ - $return->{$id}->{lock_state} = "locked" if($record->{$id}->{int20} == 1); - $return->{$id}->{lock_state} = "unlocked" if($record->{$id}->{int20} == 2); - $return->{$id}->{lock_state} = "locking" if($record->{$id}->{int20} == 3); + $return->{$id}->{system} = "Ilockit"; $return->{$id}->{Ilockit_GUID} = "$record->{$id}->{txt17}"; $return->{$id}->{Ilockit_ID} = "$record->{$id}->{txt18}"; - $return->{$id}->{bike_group} = ["$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$record->{$id}->{main_id}"]; #shareetool if($q->param('authcookie') && $dbt->{merchant_ids}->{$varenv->{merchant_id}}->{id} && $dbt->{merchant_ids}->{$varenv->{merchant_id}}->{id} == 187 && scalar(@{$user_tour} >= 1)){ my @service_code = split(/\s/,$record->{$id}->{txt23}); $return->{$id}->{service_code} = [@service_code]; } + }elsif($record->{$id}->{int11} eq "3"){ + $return->{$id}->{system} = "sigo"; } $op_return->{$dbt->{operator}->{$varenv->{dbname}}->{oprefix} . $id} = $return->{$id}; } diff --git a/copri4/main/src/Mod/APIsigoclient.pm b/copri4/main/src/Mod/APIsigoclient.pm new file mode 100755 index 0000000..622c541 --- /dev/null +++ b/copri4/main/src/Mod/APIsigoclient.pm @@ -0,0 +1,131 @@ +package APIsigoclient; +# +# SPDX-License-Identifier: AGPL-3.0-or-later +# Copyright (c) Rainer Gümpelein, TeilRad GmbH +# +#Client for sigo +# +#use lib qw(/var/www/copri-bike/shareeapp-fr01/src); +use warnings; +use strict; +use POSIX; +use Exporter; +our @ISA = qw (Exporter); + +use POSIX; +use CGI; +use JSON; +use LWP::UserAgent; +use DateTime; +use Time::Piece; +use Scalar::Util qw(looks_like_number); +use Config::General; + +use Lib::Config; +use Mod::DBtank; +use Mod::Basework; +use Data::Dumper; + +my $cf = new Config; +my $dbt = new DBtank; +my $bw = new Basework; + +sub new { + my $class = shift; + my $self = {}; + bless($self,$class); + return $self; +} + +my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime; + +my $api_file = "/var/www/copri4/shareeconf/apikeys.cfg"; +my $aconf = Config::General->new($api_file); +my %apikeyconf = $aconf->getall; + +my $ua = LWP::UserAgent->new; +$ua->agent("sharee sigo-client"); +my $size = $ua->max_size; +my $bytes = 1000; +$ua->max_size( $bytes ); +$ua->default_header( 'x-api-key' => $apikeyconf{sigo}->{api_key} ); + +my $json = JSON->new->allow_nonref; +my %varenv = $cf->envonline(); +my $response_in = {}; +my $dbh = ""; +my $owner = 169; + +open(FILE,">>$varenv{logdir}/APIsigo_client.log"); +print FILE "\n*** $now_dt 'sigo client' \n"; + +sub get_bikes { + my $self = shift; + + my $endpoint = "https://sigo.dev.sigo.green/api/v1/bikes"; + print "$endpoint\n"; + + my $rest_json = ""; + my $ret_json = get_sigo("","$endpoint",$rest_json); + eval { + $response_in = decode_json($ret_json); + print "<--- get_bikes response_in:\n" . Dumper($response_in); + }; + if ($@){ + print "<--- failure get_bikes raw response_in:\n" . Dumper($ret_json) . "\n"; + warn $@; + } + +} + +#main GET +sub get_sigo { + my $self = shift; + my $endpoint = shift || ""; + my $rest_json = shift || ""; + my $sigo_request = "$endpoint"; + + print FILE "===> GET sigo >> " . $sigo_request . "\n" . $rest_json . "\n"; + + my $req = HTTP::Request->new(GET => "$sigo_request"); + $req->content_type('application/json'); + + $req->content($rest_json); + + my $res = $ua->request($req); + if ($res->is_success) { + #print $res->content; + return $res->content; + print $res->status_line, "\n"; + }else { + print $res->status_line, "\n"; + } +} + + +sub post_sigo { + my $self = shift; + my $endpoint = shift || ""; + my $rest_json = shift || ""; + my $sigo_request = "$endpoint"; + + print FILE "===> POST sigo >> " . $sigo_request . "\n" . $rest_json . "\n"; + + my $req = HTTP::Request->new(POST => "$sigo_request"); + $req->content_type('application/json'); + + $req->content($rest_json); + + my $res = $ua->request($req); + if ($res->is_success) { + #print $res->content; + return $res->content; + print $res->status_line, "\n"; + }else { + print $res->status_line, "\n"; + } +} + +close(FILE); + +1; diff --git a/copri4/main/src/Mod/Pricing.pm b/copri4/main/src/Mod/Pricing.pm index 33dd5f1..567c685 100755 --- a/copri4/main/src/Mod/Pricing.pm +++ b/copri4/main/src/Mod/Pricing.pm @@ -155,9 +155,10 @@ sub sharee_pricing(){ $return->{request_time} = "$ctpos->{itime}"; $return->{start_time} = "$ctpos->{start_time}"; $return->{end_time} = "$computed_end_time"; - $return->{system} = "Ilockit" || "";#FIXME + $return->{system} = "Ilockit" if($ctpos->{int11} && $ctpos->{int11} == 2); + $return->{system} = "sigo" if($ctpos->{int11} && $ctpos->{int11} == 3); - if($ctpos->{int11} eq "2"){ + if($ctpos->{int11}){ #$return->{gps} = "$ctpos->{txt06}";#end_gps ($return->{gps}->{latitude},$return->{gps}->{longitude}) = split(/,/,$ctpos->{txt06}); @@ -172,8 +173,8 @@ sub sharee_pricing(){ $return->{tariff_description}->{track_info} = "Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!" if($ctpos->{int25}); $return->{tariff_description}->{operator_agb} = "Mit der Mietrad Anmietung wird folgender Betreiber AGB zugestimmt (als Demo sharee AGB)." if($ctpos->{ca_id} == 1842 || $ctpos->{ca_id} == 5781); - $return->{Ilockit_GUID} = "$ctpos->{txt17}"; - $return->{Ilockit_ID} = "$ctpos->{txt18}"; + $return->{Ilockit_GUID} = "$ctpos->{txt17}" if($ctpos->{int11} == 2); + $return->{Ilockit_ID} = "$ctpos->{txt18}" if($ctpos->{int11} == 2); #$return->{gps} = "$ctpos->{txt06}";#start_gps ($return->{gps}->{latitude},$return->{gps}->{longitude}) = split(/,/,$ctpos->{txt06}); $return->{lock_state} = "locked" if($ctpos->{int20} == 1); diff --git a/copri4/main/src/Tpl/Calorin.pm b/copri4/main/src/Tpl/Calorin.pm index 8bef52e..1d2b21f 100755 --- a/copri4/main/src/Tpl/Calorin.pm +++ b/copri4/main/src/Tpl/Calorin.pm @@ -240,7 +240,7 @@ sub tpl(){ my ($key,$des,$size) = split /=/,$_; if($key =~ /time/){ $size="10px"; - print $q->textfield(-id=>'datepicker1',-class=>'etxt',-name=>"start_$key",-default=>"$start_date_time",-size=>"$size",-maxlength=>20), "-", $q->textfield(-id=>'datepicker2',-class=>'etxt',-name=>"end_$key",-default=>"$end_date_time",-size=>"$size",-maxlength=>20),"\n"; + print $q->textfield(-id=>'datepicker1',-class=>'etxt',-name=>"start_$key",-override=>'1', -default=>"$start_date_time",-size=>"$size",-maxlength=>20), "-", $q->textfield(-id=>'datepicker2',-class=>'etxt',-name=>"end_$key",-override=>'1',-default=>"$end_date_time",-size=>"$size",-maxlength=>20),"\n"; } elsif($key =~ /owner/){ print $but->selector_class("$key","eselect","width:80px;",$R::owner,@_users),"\n"; diff --git a/copri4/main/src/scripts/sigo_client.pl b/copri4/main/src/scripts/sigo_client.pl new file mode 100755 index 0000000..b7ab01e --- /dev/null +++ b/copri4/main/src/scripts/sigo_client.pl @@ -0,0 +1,35 @@ +#!/usr/bin/perl +# +# SPDX-License-Identifier: AGPL-3.0-or-later +# Copyright (c) Rainer Gümpelein, TeilRad GmbH +# +# sudo su www-data -c "./src/scripts/sigo_client.pl shareedms-fr01 get_bikes" +# +use vars qw($syshost); + +BEGIN { + $syshost = $ARGV[0] || die 'syshost not defined'; +} + +use lib "/var/www/copri-bike/$syshost/src"; +use strict; +use warnings; +use POSIX; +use CGI; +use Mod::APIsigoclient; +use Data::Dumper; + +my $q = new CGI; +my $cf = new Config; +my $si = new APIsigoclient; +my $bw = new Basework; +my $lang = "de"; +my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime; + +my $todo = $ARGV[1]; + + +if($todo eq "get_bikes"){ + $si->get_bikes(); +} +