diff --git a/lib/App/Netdisco/JobQueue/PostgreSQL.pm b/lib/App/Netdisco/JobQueue/PostgreSQL.pm index d0c0626a..33d4b83a 100644 --- a/lib/App/Netdisco/JobQueue/PostgreSQL.pm +++ b/lib/App/Netdisco/JobQueue/PostgreSQL.pm @@ -8,6 +8,7 @@ use App::Netdisco::Util::Device use App::Netdisco::Backend::Job; use Module::Load (); +use JSON::PP (); use Try::Tiny; use base 'Exporter'; @@ -356,8 +357,9 @@ sub jq_insert { die 'failed to find row for custom field update' unless $row; + my $coder = JSON::PP->new->utf8(0)->allow_nonref(1)->allow_unknown(1); + $spec->{subaction} = $coder->encode( $spec->{extra} || $spec->{subaction} ); $spec->{action} =~ s/^cf_//; - $spec->{subaction} = to_json( $spec->{extra} || $spec->{subaction} ); $row->make_column_dirty('custom_fields'); $row->update({ custom_fields => \['jsonb_set(custom_fields, ?, ?)' diff --git a/lib/App/Netdisco/Worker/Plugin/Discover/Properties.pm b/lib/App/Netdisco/Worker/Plugin/Discover/Properties.pm index 40a76b71..61898428 100644 --- a/lib/App/Netdisco/Worker/Plugin/Discover/Properties.pm +++ b/lib/App/Netdisco/Worker/Plugin/Discover/Properties.pm @@ -16,6 +16,7 @@ use Dancer::Plugin::DBIC 'schema'; use Scope::Guard 'guard'; use NetAddr::IP::Lite ':lower'; use Storable 'dclone'; +use JSON::PP (); use Encode; register_worker({ phase => 'early', driver => 'snmp' }, sub { @@ -78,8 +79,10 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub { # for existing device, filter custom_fields if ($device->in_storage) { + my $coder = JSON::PP->new->utf8(0)->allow_nonref(1)->allow_unknown(1); + # get the custom_fields - my $fields = from_json ($device->custom_fields || '{}'); + my $fields = $coder->decode(Encode::encode('UTF-8',$device->custom_fields) || '{}'); my %ok_fields = map {$_ => 1} grep {defined} map {$_->{name}} @@ -88,10 +91,11 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub { # filter custom_fields for current valid fields foreach my $field (keys %$fields) { delete $fields->{$field} unless exists $ok_fields{$field}; + $fields->{$field} = Encode::decode('UTF-8', $fields->{$field}); } # set new custom_fields - $device->set_column( custom_fields => to_json $fields ); + $device->set_column( custom_fields => $coder->encode($fields) ); } # support for Hooks @@ -383,8 +387,10 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub { vars->{'hook_data'}->{'ports'} = [values %deviceports]; schema('netdisco')->resultset('DevicePort')->txn_do_locked(sub { + my $coder = JSON::PP->new->utf8(0)->allow_nonref(1)->allow_unknown(1); + # backup the custom_fields - my %fields = map {($_->{port} => from_json ($_->{custom_fields} || '{}'))} + my %fields = map {($_->{port} => $coder->decode(Encode::encode('UTF-8',$_->{custom_fields} || '{}')))} grep {exists $deviceports{$_->{port}}} $device->ports ->search(undef, {columns => [qw/port custom_fields/]}) @@ -399,10 +405,11 @@ register_worker({ phase => 'early', driver => 'snmp' }, sub { foreach my $port (keys %fields) { foreach my $field (keys %{ $fields{$port} }) { delete $fields{$port}->{$field} unless exists $ok_fields{$field}; + $fields{$port}->{$field} = Encode::decode('UTF-8', $fields{$port}->{$field}); } # set new custom_fields - $deviceports{$port}->{custom_fields} = to_json $fields{$port}; + $deviceports{$port}->{custom_fields} = $coder->encode($fields{$port}); } my $gone = $device->ports->delete({keep_nodes => 1});