Perl Config Sync

Problem this snippet solves:

This sample illustrates how to use the ConfigSync interfaces in perl.

Code :

#!/usr/bin/perl
#----------------------------------------------------------------------------
# The contents of this file are subject to the "END USER LICENSE AGREEMENT FOR F5
# Software Development Kit for iControl"; you may not use this file except in
# compliance with the License. The License is included in the iControl
# Software Development Kit.
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is iControl Code and related documentation
# distributed by F5.
#
# The Initial Developer of the Original Code is F5 Networks,
# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,
# Inc. All Rights Reserved.  iControl (TM) is a registered trademark of F5 Networks, Inc.
#
# Alternatively, the contents of this file may be used under the terms
# of the GNU General Public License (the "GPL"), in which case the
# provisions of GPL are applicable instead of those above.  If you wish
# to allow use of your version of this file only under the terms of the
# GPL and not to allow others to use your version of this file under the
# License, indicate your decision by deleting the provisions above and
# replace them with the notice and other provisions required by the GPL.
# If you do not delete the provisions above, a recipient may use your
# version of this file under either the License or the GPL.
#----------------------------------------------------------------------------

#use SOAP::Lite + trace => qw(method debug);
use SOAP::Lite;
use MIME::Base64;

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

$| = 1;

BEGIN { push (@INC, ".."); }
use iControlTypeCast;

$sHost = $ARGV[0];
$sPort = $ARGV[1];
$sUID = $ARGV[2];
$sPWD = $ARGV[3];
$sCOMMAND = $ARGV[4];
$sArg1 = $ARGV[5];
$sArg2 = $ARGV[6];

#----------------------------------------------------------------------------
# Validate Arguments
#----------------------------------------------------------------------------

my $sConfigName = "";
my $sLocalFile = "";
my $sSaveMode = "";
my $sProtocol;
my $defaultChunkSize = 65536/2;

my $FileChainType =
{
  0 => "FILE_UNDEFINED",
  1 => "FILE_FIRST",
  2 => "FILE_MIDDLE",
  3 => "FILE_UNUSED",
  4 => "FILE_LAST",
  5 => "FILE_FIRST_AND_LAST",
};
my $FileChainTypeValue =
{
  "FILE_UNDEFINED" => 0,
  "FILE_FIRST" => 1,
  "FILE_MIDDLE" => 2,
  "FILE_UNUSED" => 3,
  "FILE_LAST" => 4,
  "FILE_FIRST_AND_LAST" => 5,
};

my $FILE_UNDEFINED = "FILE_UNDEFINED";
my $FILE_FIRST = "FILE_FIRST";
my $FILE_MIDDLE = "FILE_MIDDLE";
my $FILE_UNUSED = "FILE_UNUSED";
my $FILE_LAST = "FILE_LAST";
my $FILE_FIRST_AND_LAST = "FILE_FIRST_AND_LAST";

my $SaveMode = 
{
  0 => "SAVE_FULL",
  1 => "SAVE_HIGH_LEVEL_CONFIG",
  2 => "SAVE_BASE_LEVEL_CONFIG",
};
my $SaveModeValue =
{
  "SAVE_FULL" => 0,
  "SAVE_HIGH_LEVEL_CONFIG" => 1,
  "SAVE_BASE_LEVEL_CONFIG" => 2,
};

my $SAVE_FULL = "SAVE_FULL";
my $SAVE_HIGH_LEVEL_CONFIG = "SAVE_HIGH_LEVEL_CONFIG";
my $SAVE_BASE_LEVEL_CONFIG = "SAVE_BASE_LEVEL_CONFIG";

my $SyncMode =
{
  0 => "CONFIGSYNC_BASIC",
  1 => "CONFIGSYNC_RUNNING",
  2 => "CONFIGSYNC_ALL",
};
my $SyncModeValue =
{
  "CONFIGSYNC_BASIC" => 0,
  "CONFIGSYNC_RUNNING" => 1,
  "CONFIGSYNC_ALL" => 2,
};

my $CONFIGSYNC_BASIC = "CONFIGSYNC_BASIC";
my $CONFIGSYNC_RUNNING = "CONFIGSYNC_RUNNING";
my $CONFIGSYNC_ALL = "CONFIGSYNC_ALL";


#----------------------------------------------------------------------------
# Verify connection info
#----------------------------------------------------------------------------
if ( ($sHost eq "") or ($sUID eq "") or ($sPWD eq "") )
{
  &usage();
}

if ( ($sPort ne "80") and ($sPort ne "8080") )
{
  $sProtocol = "https";
}
else
{
  $sProtocol = "http";
}

#----------------------------------------------------------------------------
# Transport Information
#----------------------------------------------------------------------------
sub SOAP::Transport::HTTP::Client::get_basic_credentials
{
  return "$sUID" => "$sPWD";
}

$ConfigSync = SOAP::Lite
  -> uri('urn:iControl:System/ConfigSync')
  -> readable(1)
  -> proxy("$sProtocol://$sHost:$sPort/iControl/iControlPortal.cgi");
eval { $ConfigSync->transport->http_request->header
(
  'Authorization' => 
    'Basic ' . MIME::Base64::encode("$sUID:$sPWD", '')
); };

&checkParameters(); 


#----------------------------------------------------------------------------
# Get Command Parameters 
#----------------------------------------------------------------------------
sub getParamsAndGo
{
  my $theCommandID = $_[0];
  if ( 1 eq $theCommandID )
  {
    print " Filename for configuration backup (empty for default): ";
    chomp ($configName = );
    if ( "" eq $configName )
    {
      $configName = generateConfigName();
    }
    $localFile = $sConfigName;

    print "Backing up configuration $configName\n";
  
    $success = &backupConfiguration($configName, $localFile, 1);
    if ( 1 == $success )
    {
      print "Backup succeeded\n";
    }
    else
    {
      print "Backup failed\n";
    }
         
  }
  elsif ( 2 eq  $theCommandID)
  {
    print " Config back up file to restore: ";
    chomp ($sConfigName = );
    print " Sync devices after install? (y/n): ";
    chomp ($sDoSync = );
    $sLocalFile = $sConfigName;
    $sSaveMode = "full";

    print "Restoring configuration $sLocalFile\n";
    $success = &restoreConfiguration($sLocalFile, $sDoSync, 1);
    if ( 1 == $success )
    {
      print "Restore succeeded\n";
    }
    else
    {
      print "Restore failed\n";
    }
  }
  elsif ( 3 eq $theCommandID )
  {
    usage();
  }
  else
  {
    print "Synching\n\n";
  }
}

#----------------------------------------------------------------------------
# Check Parameters 
#----------------------------------------------------------------------------
sub checkParameters
{
  if
  (
    ("list" ne $sCOMMAND) and
    ("checksum" ne $sCOMMAND) and
    ("delete" ne $sCOMMAND) and
    ("save" ne $sCOMMAND) and
    ("install" ne $sCOMMAND) and
    ("rollback" ne $sCOMMAND) and
    ("download" ne $sCOMMAND) and
    ("upload" ne $sCOMMAND) and
    ("download-file" ne $sCOMMAND) and
    ("upload-file" ne $sCOMMAND) and
    ("backup" ne $sCOMMAND) and
    ("restore" ne $sCOMMAND) and
    ("sync" ne $sCOMMAND)
  )
  {
    &usage();
  }
    
  if ( "list" eq $sCOMMAND )
  {
    &listConfigurations();
  }
    
  if ( "checksum" eq $sCOMMAND )
  {
    &checksumConfiguration($sArg1);
  }
    
  if ( "delete" eq $sCOMMAND )
  {
    &deleteConfiguration($sArg1);
  }
    
  if ( "save" eq $sCOMMAND )
  {
    if ( "" eq $sArg1 )
    {
      $sArg1 = generateConfigName();
    }
    &saveConfiguration($sArg1, &saveModeFromArg($sArg2));
  }
    
  if ( "install" eq $sCOMMAND )
  {
    &installConfiguration($sArg1);
  }
    
  if ( "rollback" eq $sCOMMAND )
  {
    &rollbackConfiguration();
  }
    
  if ( "download" eq $sCOMMAND )
  {
    &downloadConfiguration($sArg1, $sArg2);
  }

  if ( "upload" eq $sCOMMAND )
  {
    &uploadConfiguration($sArg1, $sArg2);
  }

  if ( "download-file" eq $sCOMMAND )
  {
    &downloadFile($sArg1, $sArg2);
  }

  if ( "upload-file" eq $sCOMMAND )
  {
    &uploadFile($sArg1, $sArg2);
  }

  if ( "backup" eq $sCOMMAND )
  {
    $configName = generateConfigName();
    $localFile = $configName;

    print "Backing up configuration $configName\n";
  
    $success = &backupConfiguration($configName, $localFile, 1);
    if ( 1 == $success )
    {
      print "Backup succeeded\n";
    }
    else
    {
      print "Backup failed\n";
    }
  }

  if ( "restore" eq $sCOMMAND )
  {
    print "Restoring configuration $sArg1\n";
    $success = &restoreConfiguration($sArg1, 0, 1);
    if ( 1 == $success )
    {
      print "Restore succeeded\n";
    }
    else
    {
      print "Restore failed\n";
    }
  }

  if ( "sync" eq $sCOMMAND )
  {
    &syncConfiguration(&syncModeFromArg($sArg1));
  }
}

#----------------------------------------------------------------------------
# sub usage()
#----------------------------------------------------------------------------
sub usage()
{
  my ($subKey) = (@_);

  print "Usage: ConfigSync.pl host port uid pwd command [command_args]\n";
  print "    command\n";
  print "    --------\n";

  if ( ("" eq $subKey) or ("list" eq $subKey) )
  {
    print "    list\n";
    print "              Lists available configuration files on the server.\n";
    print "        Args: None\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("checksum" eq $subKey) )
  {
#    print "    checksum  config_name\n";
#    print "              Retrieves the checksum for the given configuration file.\n";
#    print "\n";
  }
  if ( ("" eq $subKey) or ("save" eq $subKey) )
  {
    print "    save      Creates a snapshot of the current configuration.\n";
    print "        Args: config_name [full | high | base]\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("install" eq $subKey) )
  {
    print "    install   Installs a given configuration file.\n";
    print "        Args: config_name\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("rollback" eq $subKey) )
  {
    print "    rollback  Performs a rollback to the last loaded configuration.\n";
    print "        Args: None\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("delete" eq $subKey) )
  {
    print "    delete    Deletes a given configuration file.\n";
    print "        Args: config_name\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("download" eq $subKey) )
  {
    print "    download  Downloads a given configuration file from the server.\n";
    print "        Args: config_name local_file\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("upload" eq $subKey) )
  {
    print "    upload    Uploads a configuration to the server from the client machine.\n";
    print "        Args: local_file config_name\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("download-file" eq $subKey) )
  {
    print "download-file Downloads a given file file from the server.\n";
    print "        Args: remote_file local_file\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("upload-file" eq $subKey) )
  {
    print "  upload-file Uploads a file to the server from the client machine.\n";
    print "        Args: local_file remote_file\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("sync" eq $subKey) )
  {
    print "    sync      Signals a configuration sync between HA devices.\n";
    print "        Args: [basic | running | all]\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("backup" eq $subKey) )
  {
    print "    backup    Saves configuration and downloads the configuration file.\n";
    print "        Args: None\n";
    print "\n";
  }
  if ( ("" eq $subKey) or ("restore" eq $subKey) )
  {
    print "    restore   Restores a configuration from the client machine.\n";
    print "        Args: local_file\n";
  }
  exit(1);
}

#============================================================================
#
# Helper Methods
#
#============================================================================

#----------------------------------------------------------------------------
# sub generateConfigName
#----------------------------------------------------------------------------
sub generateConfigName()
{
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  $year += 1900;
  $sName = sprintf("%s-%04d%02d%02d_%02d%02d%02d.ucs", $sHost, $year, $mon, $mday, $hour, $min, $sec);
  return $sName;
}

#----------------------------------------------------------------------------
# sub saveModeFromArg
#----------------------------------------------------------------------------
sub saveModeFromArg()
{
  my ($sSaveModeArg) = (@_);
  my $sSaveMode = $SAVE_FULL;
  
  if ( ("full" ne $sSaveModeArg) and ("high" ne $sSaveModeArg) and ("base" ne $sSaveModeArg) )
  {
    $sSaveModeArg = "full";
  }

  if ( "full" eq $sSaveModeArg )
  {
    $sSaveMode = $SAVE_FULL;
  }
  elsif ( "high" eq $sSaveModeArg )
  {
    $sSaveMode = $SAVE_HIGH_LEVEL_CONFIG;
  }
  elsif ( "base" eq $sSaveModeArg )
  {
    $sSaveMode = $SAVE_BASE_LEVEL_CONFIG;
  }
  return $sSaveMode;
}

#----------------------------------------------------------------------------
# syncModeFromArg
#----------------------------------------------------------------------------
sub syncModeFromArg()
{
  my $sSyncModeArg = @_;
  my $sSyncMode = $CONFIGSYNC_ALL;

  if ( ("basic" ne $sSyncModeArg) and ("running" ne $sSyncModeArg) and ("all" ne $sSyncModeArg) )
  {
    $sSyncModeArg = "all";
  }
  
  if ( "all" eq $sSyncModeArg )
  {
    $sSyncMode = $CONFIGSYNC_ALL;
  }
  if ( "basic" eq $sSyncModeArg )
  {
    $sSyncMode = $CONFIGSYNC_BASIC;
  }
  if ( "running" eq $sSyncModeArg )
  {
    $sSyncMode = $CONFIGSYNC_RUNNING;
  }

  return $sSyncMode;
}


#============================================================================
#
# Command Methods
#
#============================================================================

#----------------------------------------------------------------------------
# sub listConfigurations
#----------------------------------------------------------------------------
sub listConfigurations()
{
  $soap_response = $ConfigSync->get_configuration_list();
  if ( $soap_response->fault )
  {
    print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
  }
  else
  {
    my @ConfigFileEntryList = @{$soap_response->result};
    print "Available Configurations:\n";
    my $configNumber = 0;
    foreach my $ConfigFileEntry (@ConfigFileEntryList)
    {
      print "    (",
        substr($ConfigFileEntry->{"file_datetime"}, 0, -1),
        ") : '",
        $ConfigFileEntry->{"file_name"},
        "'\n";
      $configNumber++;
    }
  }
}

#----------------------------------------------------------------------------
# sub checksumConfiguration
#----------------------------------------------------------------------------
sub checksumConfiguration()
{
  my ($configName, $quiet) = (@_);
  my $success = 0;

  if ( "" eq $configName )
  {
    &usage("checksum");
  }

  eval
  {
    $soap_response = $ConfigSync->get_configuration_checksum
    (
      SOAP::Data->name(filename => $configName)
    );
  };

  if ( $soap_response and $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    $checksum = $soap_response->result;
    if ( 1 != $quiet )
    {
      print "Configuration '$sConfigName' checksum: '$checksum'\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub deleteConfiguration
#----------------------------------------------------------------------------
sub deleteConfiguration()
{
  my ($configName, $quiet) = (@_);
  my $success = 0;

  if ( "" eq $configName )
  {
    &usage("delete");
  }
  
  eval
  {
    $soap_response = $ConfigSync->delete_configuration
    (
      SOAP::Data->name(filename => $configName)
    );
  };

  if ( $soap_response and $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    if ( 1 != $quiet )
    {
      print "Configuration '$configName' deleted successfully!\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub saveConfiguration
#----------------------------------------------------------------------------
sub saveConfiguration()
{
  my ($configName, $saveMode, $quiet) = (@_);
  my $success = 0;

  if ( ("" eq $configName) or ("" eq $saveMode) )
  {
    &usage("save");
  }
  
  $soap_response = $ConfigSync->save_configuration
  (
    SOAP::Data->name(filename => $configName),
    SOAP::Data->name(save_flag => $saveMode)
  );
  if ( $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    if ( 1 != $quiet )
    {
      print "Configuration '$configName' saved successfully!\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub installConfiguration
#----------------------------------------------------------------------------
sub installConfiguration()
{
  my ($configName, $quiet) = (@_);
  my $success = 0;

  if ( "" eq $configName )
  {
    &usage("install");
  }

  eval
  {
    $soap_response = $ConfigSync->install_configuration
    (
      SOAP::Data->name(filename => $configName)
    );
  };

  if ( $soap_response and $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    if ( 1 != $quiet )
    {
      print "Configuration '$configName' installed successfully!\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub rollbackConfiguration
#----------------------------------------------------------------------------
sub rollbackConfiguration()
{
  my ($quiet) = (@_);
  my $success = 0;

  eval
  {
    $soap_response = $ConfigSync->rollback_configuration();
  };

  if ( $soap_response and $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    if ( 1 != $quiet )
    {
      print "Configuration rollback successful!\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub downloadConfiguration
#----------------------------------------------------------------------------
sub downloadConfiguration()
{
  my ($configName, $localFile, $quiet) = (@_);
  $success = 0;

  if ( "" eq $localFile )
  {
    $localFile = $configName;
  }

  if ( "" eq $configName )
  {
    &usage("download");
  }

  open (LOCAL_FILE, ">$localFile") or die("Can't open $localFile for output: $!");
  binmode(LOCAL_FILE);

  my $file_offset = 0;
  my $chunk_size = $defaultChunkSize;
  my $chain_type = $FILE_UNDEFINED;
     my $bContinue = 1;

     print "\n";
  while ( 1 == $bContinue )
  {
    $soap_response = $ConfigSync->download_configuration
    (
      SOAP::Data->name(config_name => $configName),
      SOAP::Data->name(chunk_size => $chunk_size),
      SOAP::Data->name(file_offset => $file_offset)
    );

    if ( $soap_response->fault )
    {
      if ( 1 != $quiet )
      {
        print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
      }
      $bContinue = 0;
    }
    else
    {
      $FileTransferContext = $soap_response->result;
      $file_data = $FileTransferContext->{"file_data"};
      $chain_type = $FileTransferContext->{"chain_type"};
      @params = $soap_response->paramsout;
      $file_offset = @params[0];

      # Append Data to File
      print LOCAL_FILE $file_data;

#      if ( 1 != $quiet )
#      {
        print "Bytes Transferred: $file_offset\n";
#      }

      if ( ("FILE_LAST" eq $chain_type) or
           ("FILE_FIRST_AND_LAST" eq $chain_type) )
      {
        $bContinue = 0;
        $success = 1;
      }
    }
  }
  print "\n";

  close(LOCAL_FILE);

  return $success;
}

#----------------------------------------------------------------------------
# sub uploadConfiguration
#----------------------------------------------------------------------------
sub uploadConfiguration()
{
  my ($localFile, $configName, $quiet) = (@_);
  $success = 0;

  if ( "" eq $configName )
  {
    $configName = $localFile;
  }

  if ( "" eq $localFile )
  {
    &usage("upload");
  }

  $bContinue = 1;
  $chain_type = $FILE_FIRST;
  $preferred_chunk_size = $defaultChunkSize;
  $chunk_size = $defaultChunkSize;
  $total_bytes = 0;

  open(LOCAL_FILE, "<$localFile") or die("Can't open $localFile for input: $!");
  binmode(LOCAL_FILE);

  while (1 == $bContinue )
  {
    $file_data = "";
    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);

    if ( $preferred_chunk_size != $bytes_read )
    {
      if ( $total_bytes == 0 )
      {
        $chain_type = $FILE_FIRST_AND_LAST;
      }
      else
      {
        $chain_type = $FILE_LAST;
      }
      $bContinue = 0;
    }
    $total_bytes += $bytes_read;

    $FileTransferContext =
    {
      file_data => SOAP::Data->type(base64 => $file_data),
      chain_type => $chain_type
    };


    $soap_response = $ConfigSync->upload_configuration
    (
      SOAP::Data->name(config_name => $configName),
      SOAP::Data->name(file_context => $FileTransferContext)
    );

    if ( $soap_response->fault )
    {
#      if ( 1 != $quiet )
#      {
        print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
#      }
      $success = 0;
      $bContinue = 0;
    }
    else
    {
#      if ( 1 != $quiet )
#      {
        print "Uploaded $total_bytes bytes\n";
#      }
      $success = 1;
    }

    $chain_type = $FILE_MIDDLE;
  }
  print "\n";

  close(LOCAL_FILE);

  return $success;
}

#----------------------------------------------------------------------------
# sub downloadFile
#----------------------------------------------------------------------------
sub downloadFile()
{
  my ($configName, $localFile, $quiet) = (@_);
  $success = 0;

  if ( "" eq $localFile )
  {
    $localFile = $configName;
  }

  if ( "" eq $configName )
  {
    &usage("download");
  }

  open (LOCAL_FILE, ">$localFile") or die("Can't open $localFile for output: $!");
  binmode(LOCAL_FILE);

  my $file_offset = 0;
  my $chunk_size = $defaultChunkSize;
  my $chain_type = $FILE_UNDEFINED;
     my $bContinue = 1;

     print "\n";
  while ( 1 == $bContinue )
  {
    $soap_response = $ConfigSync->download_file
    (
      SOAP::Data->name(file_name => $configName),
      SOAP::Data->name(chunk_size => $chunk_size),
      SOAP::Data->name(file_offset => $file_offset)
    );

    if ( $soap_response->fault )
    {
      if ( 1 != $quiet )
      {
        print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
      }
      $bContinue = 0;
    }
    else
    {
      $FileTransferContext = $soap_response->result;
      $file_data = $FileTransferContext->{"file_data"};
      $chain_type = $FileTransferContext->{"chain_type"};
      @params = $soap_response->paramsout;
      $file_offset = @params[0];

      # Append Data to File
      print LOCAL_FILE $file_data;

#      if ( 1 != $quiet )
#      {
        print "Bytes Transferred: $file_offset\n";
#      }

      if ( ("FILE_LAST" eq $chain_type) or
           ("FILE_FIRST_AND_LAST" eq $chain_type) )
      {
        $bContinue = 0;
        $success = 1;
      }
    }
  }
  print "\n";

  close(LOCAL_FILE);

  return $success;
}

#----------------------------------------------------------------------------
# sub uploadFile
#----------------------------------------------------------------------------
sub uploadFile()
{
  my ($localFile, $configName, $quiet) = (@_);
  $success = 0;

  if ( "" eq $configName )
  {
    $configName = $localFile;
  }

  if ( "" eq $localFile )
  {
    &usage("upload");
  }

  $bContinue = 1;
  $chain_type = $FILE_FIRST;
  $preferred_chunk_size = $defaultChunkSize;
  $chunk_size = $defaultChunkSize;
  $total_bytes = 0;

  open(LOCAL_FILE, "<$localFile") or die("Can't open $localFile for input: $!");
  binmode(LOCAL_FILE);

  while (1 == $bContinue )
  {
    $file_data = "";
    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);

    if ( $preferred_chunk_size != $bytes_read )
    {
      if ( $total_bytes == 0 )
      {
        $chain_type = $FILE_FIRST_AND_LAST;
      }
      else
      {
        $chain_type = $FILE_LAST;
      }
      $bContinue = 0;
    }
    $total_bytes += $bytes_read;

    $FileTransferContext =
    {
      file_data => SOAP::Data->type(base64 => $file_data),
      chain_type => $chain_type
    };


    $soap_response = $ConfigSync->upload_file
    (
      SOAP::Data->name(file_name => $configName),
      SOAP::Data->name(file_context => $FileTransferContext)
    );

    if ( $soap_response->fault )
    {
#      if ( 1 != $quiet )
#      {
        print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
#      }
      $success = 0;
      $bContinue = 0;
    }
    else
    {
#      if ( 1 != $quiet )
#      {
        print "Uploaded $total_bytes bytes\n";
#      }
      $success = 1;
    }

    $chain_type = $FILE_MIDDLE;
  }
  print "\n";

  close(LOCAL_FILE);

  return $success;
}

#----------------------------------------------------------------------------
# sub syncConfiguration
#----------------------------------------------------------------------------
sub syncConfiguration()
{
  my ($syncFlag, $quiet) = (@_);
  my $success = 0;

  if ( "" eq $syncFlag )
  {
    &usage("sync");
  }

  $soap_response = $ConfigSync->synchronize_configuration
  (
    SOAP::Data->name(sync_flag => $syncFlag)
  );
  if ( $soap_response->fault )
  {
    if ( 1 != $quiet )
    {
      print $soap_response->faultcode, " ", $soap_response->faultstring, "\n";
    }
  }
  else
  {
    $success = 1;
    if ( 1 != $quiet )
    {
      print "Configuration synchronized successfully!\n";
    }
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub backupConfiguration
#----------------------------------------------------------------------------
sub backupConfiguration()
{
  my ($configName, $localFile, $quiet) = (@_);

  if ( "" eq $configName )
  {
    $configName = generateConfigName();
  }
  if ( "" eq $localFile )
  {
    $localFile = $configName;
  }

  if ( ("" eq $configName) or ("" eq $localFile) )
  {
    &usage("backup");
  }

  sleep(1);
  $success = &saveConfiguration($configName, $SAVE_FULL, $quiet);
  if ( 1 == $success )
  {
    sleep(1);
    $success = &downloadConfiguration($configName, $localFile, $quiet);
    if ( 1 == $success )
    {
      if ( 1 != $quiet )
      {
        print "Configuration file $configName successfully backed up.\n";
      }
    }
    sleep(1);
    $success = &deleteConfiguration($configName, $quiet);
  }
  return $success;
}

#----------------------------------------------------------------------------
# sub restoreConfiguration
#----------------------------------------------------------------------------
sub restoreConfiguration()
{
  my ($localFile, $doSync, $quiet) = (@_);

  $configName = $localFile;

  if ( ("" eq $configName) or ("" eq $localFile) )
  {
    &usage("restore");
  }

  sleep(1);
  $success = &uploadConfiguration($localFile, $configName, $quiet);
  if ( 1 == $success )
  {
    sleep(1);
    $success = &installConfiguration($configName, $quiet);
    if ( 1 == $success )
    {
      if ( ("1" eq $doSync) or ("y" eq $doSync) or ("Y" eq $doSync) )
      {
        # Give server time to recover from restart.
        sleep(5);
        &syncConfiguration(&syncModeFromArg("all"), $quiet);
      }
    }
    sleep(1);
    &deleteConfiguration($configName, $quiet);
  }
  return $success;
}
Published Mar 08, 2015
Version 1.0
No CommentsBe the first to comment
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_MetaNav\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"message:277926\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/codeshare/perl-config-sync/277926\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"message:277926\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/codeshare/perl-config-sync/277926\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"componentScriptGroups({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"message:277926\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com/kb/codeshare/perl-config-sync/277926\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"componentScriptGroups({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/guides/GuideBottomNavigation\"]})":[{"__ref":"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"components/customComponent/CustomComponent\"]})":[{"__ref":"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1744046271000"}],"cachedText({\"lastModified\":\"1744046271000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1744046271000"}]},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Anonymous","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":null,"possibleValues":["en-US","de-DE"]},"repliesSortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT","localValue":"DEFAULT","possibleValues":["DEFAULT","LIKES","PUBLISH_TIME","REVERSE_PUBLISH_TIME"]}},"deleted":false},"CachedAsset:pages-1746693049844":{"__typename":"CachedAsset","id":"pages-1746693049844","value":[{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.MvpProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/mvp-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.AdvocacyProgram","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/advocacy-program","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp.NonCustomer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/non-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Customer","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-customer","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetInvolved","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.Learn","type":"COMMUNITY","urlPath":"/c/how-do-i/learn","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1739501996000,"localOverride":null,"page":{"id":"Test","type":"CUSTOM","urlPath":"/custom-test-2","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp.Community","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/community","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetInvolved.ContributeCode","type":"COMMUNITY","urlPath":"/c/how-do-i/get-involved/contribute-code","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.Learn.AboutIrules","type":"COMMUNITY","urlPath":"/c/how-do-i/learn/about-irules","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp.F5Support","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/f5-support","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HealthCheckPage","type":"COMMUNITY","urlPath":"/health","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI.GetHelp.SecurityIncident","type":"COMMUNITY","urlPath":"/c/how-do-i/get-help/security-incident","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1746693049844,"localOverride":null,"page":{"id":"HowDoI","type":"COMMUNITY","urlPath":"/c/how-do-i","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}","userBanned":"We're sorry, but you have been banned from using this site.","userBannedReason":"You have been banned for the following reason: {reason}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:38":{"__typename":"Rank","id":"rank:38","position":15,"name":"Cirrus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzgtTzNNNGh5\"}"},"rankStyle":"FILLED"},"User:user:131293":{"__typename":"User","id":"user:131293","uid":131293,"login":"CodeCentral_194","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-10.svg?time=0"},"rank":{"__ref":"Rank:rank:38"},"email":"","messagesCount":277,"biography":null,"topicsCount":277,"kudosReceivedCount":7,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-05-04T20:11:22.000-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","entityType":"CATEGORY","displayId":"CrowdSRC","nodeType":"category","depth":1,"title":"CrowdSRC","shortTitle":"CrowdSRC","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","entityType":"CATEGORY","displayId":"top","nodeType":"category","depth":0,"title":"Top","shortTitle":"Top"},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","entityType":"TKB","displayId":"codeshare","nodeType":"board","depth":2,"conversationStyle":"TKB","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"PUBLISH_TIME","repliesFormat":"threaded"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"FREEFORM_AND_PRESET","description":"Have some code. Share some code.","title":"CodeShare","shortTitle":"CodeShare","parent":{"__ref":"Category:category:CrowdSRC"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:CrowdSRC"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"theme":{"__ref":"Theme:customTheme1"},"boardPolicies":{"__typename":"BoardPolicies","canViewSpamDashBoard":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.access_spam_quarantine.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.access_spam_quarantine.allowed.accessDenied","args":[]}},"canArchiveMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.content_archivals.enable_content_archival_settings.accessDenied","key":"error.lithium.policies.content_archivals.enable_content_archival_settings.accessDenied","args":[]}},"canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"isManualSortOrderAvailable":false,"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"TkbTopicMessage:message:277926":{"__typename":"TkbTopicMessage","uid":277926,"subject":"Perl Config Sync","id":"message:277926","revisionNum":1,"repliesCount":0,"author":{"__ref":"User:user:131293"},"depth":0,"hasGivenKudo":false,"helpful":null,"board":{"__ref":"Tkb:board:codeshare"},"conversation":{"__ref":"Conversation:conversation:277926"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:277926"},"teaser":"","body":"

Problem this snippet solves:

This sample illustrates how to use the ConfigSync interfaces in perl.

Code :

#!/usr/bin/perl\n#----------------------------------------------------------------------------\n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\n# Software Development Kit for iControl\"; you may not use this file except in\n# compliance with the License. The License is included in the iControl\n# Software Development Kit.\n#\n# Software distributed under the License is distributed on an \"AS IS\"\n# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n# the License for the specific language governing rights and limitations\n# under the License.\n#\n# The Original Code is iControl Code and related documentation\n# distributed by F5.\n#\n# The Initial Developer of the Original Code is F5 Networks,\n# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\n# Inc. All Rights Reserved.  iControl (TM) is a registered trademark of F5 Networks, Inc.\n#\n# Alternatively, the contents of this file may be used under the terms\n# of the GNU General Public License (the \"GPL\"), in which case the\n# provisions of GPL are applicable instead of those above.  If you wish\n# to allow use of your version of this file only under the terms of the\n# GPL and not to allow others to use your version of this file under the\n# License, indicate your decision by deleting the provisions above and\n# replace them with the notice and other provisions required by the GPL.\n# If you do not delete the provisions above, a recipient may use your\n# version of this file under either the License or the GPL.\n#----------------------------------------------------------------------------\n\n#use SOAP::Lite + trace => qw(method debug);\nuse SOAP::Lite;\nuse MIME::Base64;\n\n$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;\n\n$| = 1;\n\nBEGIN { push (@INC, \"..\"); }\nuse iControlTypeCast;\n\n$sHost = $ARGV[0];\n$sPort = $ARGV[1];\n$sUID = $ARGV[2];\n$sPWD = $ARGV[3];\n$sCOMMAND = $ARGV[4];\n$sArg1 = $ARGV[5];\n$sArg2 = $ARGV[6];\n\n#----------------------------------------------------------------------------\n# Validate Arguments\n#----------------------------------------------------------------------------\n\nmy $sConfigName = \"\";\nmy $sLocalFile = \"\";\nmy $sSaveMode = \"\";\nmy $sProtocol;\nmy $defaultChunkSize = 65536/2;\n\nmy $FileChainType =\n{\n  0 => \"FILE_UNDEFINED\",\n  1 => \"FILE_FIRST\",\n  2 => \"FILE_MIDDLE\",\n  3 => \"FILE_UNUSED\",\n  4 => \"FILE_LAST\",\n  5 => \"FILE_FIRST_AND_LAST\",\n};\nmy $FileChainTypeValue =\n{\n  \"FILE_UNDEFINED\" => 0,\n  \"FILE_FIRST\" => 1,\n  \"FILE_MIDDLE\" => 2,\n  \"FILE_UNUSED\" => 3,\n  \"FILE_LAST\" => 4,\n  \"FILE_FIRST_AND_LAST\" => 5,\n};\n\nmy $FILE_UNDEFINED = \"FILE_UNDEFINED\";\nmy $FILE_FIRST = \"FILE_FIRST\";\nmy $FILE_MIDDLE = \"FILE_MIDDLE\";\nmy $FILE_UNUSED = \"FILE_UNUSED\";\nmy $FILE_LAST = \"FILE_LAST\";\nmy $FILE_FIRST_AND_LAST = \"FILE_FIRST_AND_LAST\";\n\nmy $SaveMode = \n{\n  0 => \"SAVE_FULL\",\n  1 => \"SAVE_HIGH_LEVEL_CONFIG\",\n  2 => \"SAVE_BASE_LEVEL_CONFIG\",\n};\nmy $SaveModeValue =\n{\n  \"SAVE_FULL\" => 0,\n  \"SAVE_HIGH_LEVEL_CONFIG\" => 1,\n  \"SAVE_BASE_LEVEL_CONFIG\" => 2,\n};\n\nmy $SAVE_FULL = \"SAVE_FULL\";\nmy $SAVE_HIGH_LEVEL_CONFIG = \"SAVE_HIGH_LEVEL_CONFIG\";\nmy $SAVE_BASE_LEVEL_CONFIG = \"SAVE_BASE_LEVEL_CONFIG\";\n\nmy $SyncMode =\n{\n  0 => \"CONFIGSYNC_BASIC\",\n  1 => \"CONFIGSYNC_RUNNING\",\n  2 => \"CONFIGSYNC_ALL\",\n};\nmy $SyncModeValue =\n{\n  \"CONFIGSYNC_BASIC\" => 0,\n  \"CONFIGSYNC_RUNNING\" => 1,\n  \"CONFIGSYNC_ALL\" => 2,\n};\n\nmy $CONFIGSYNC_BASIC = \"CONFIGSYNC_BASIC\";\nmy $CONFIGSYNC_RUNNING = \"CONFIGSYNC_RUNNING\";\nmy $CONFIGSYNC_ALL = \"CONFIGSYNC_ALL\";\n\n\n#----------------------------------------------------------------------------\n# Verify connection info\n#----------------------------------------------------------------------------\nif ( ($sHost eq \"\") or ($sUID eq \"\") or ($sPWD eq \"\") )\n{\n  &usage();\n}\n\nif ( ($sPort ne \"80\") and ($sPort ne \"8080\") )\n{\n  $sProtocol = \"https\";\n}\nelse\n{\n  $sProtocol = \"http\";\n}\n\n#----------------------------------------------------------------------------\n# Transport Information\n#----------------------------------------------------------------------------\nsub SOAP::Transport::HTTP::Client::get_basic_credentials\n{\n  return \"$sUID\" => \"$sPWD\";\n}\n\n$ConfigSync = SOAP::Lite\n  -> uri('urn:iControl:System/ConfigSync')\n  -> readable(1)\n  -> proxy(\"$sProtocol://$sHost:$sPort/iControl/iControlPortal.cgi\");\neval { $ConfigSync->transport->http_request->header\n(\n  'Authorization' => \n    'Basic ' . MIME::Base64::encode(\"$sUID:$sPWD\", '')\n); };\n\n&checkParameters(); \n\n\n#----------------------------------------------------------------------------\n# Get Command Parameters \n#----------------------------------------------------------------------------\nsub getParamsAndGo\n{\n  my $theCommandID = $_[0];\n  if ( 1 eq $theCommandID )\n  {\n    print \" Filename for configuration backup (empty for default): \";\n    chomp ($configName = );\n    if ( \"\" eq $configName )\n    {\n      $configName = generateConfigName();\n    }\n    $localFile = $sConfigName;\n\n    print \"Backing up configuration $configName\\n\";\n  \n    $success = &backupConfiguration($configName, $localFile, 1);\n    if ( 1 == $success )\n    {\n      print \"Backup succeeded\\n\";\n    }\n    else\n    {\n      print \"Backup failed\\n\";\n    }\n         \n  }\n  elsif ( 2 eq  $theCommandID)\n  {\n    print \" Config back up file to restore: \";\n    chomp ($sConfigName = );\n    print \" Sync devices after install? (y/n): \";\n    chomp ($sDoSync = );\n    $sLocalFile = $sConfigName;\n    $sSaveMode = \"full\";\n\n    print \"Restoring configuration $sLocalFile\\n\";\n    $success = &restoreConfiguration($sLocalFile, $sDoSync, 1);\n    if ( 1 == $success )\n    {\n      print \"Restore succeeded\\n\";\n    }\n    else\n    {\n      print \"Restore failed\\n\";\n    }\n  }\n  elsif ( 3 eq $theCommandID )\n  {\n    usage();\n  }\n  else\n  {\n    print \"Synching\\n\\n\";\n  }\n}\n\n#----------------------------------------------------------------------------\n# Check Parameters \n#----------------------------------------------------------------------------\nsub checkParameters\n{\n  if\n  (\n    (\"list\" ne $sCOMMAND) and\n    (\"checksum\" ne $sCOMMAND) and\n    (\"delete\" ne $sCOMMAND) and\n    (\"save\" ne $sCOMMAND) and\n    (\"install\" ne $sCOMMAND) and\n    (\"rollback\" ne $sCOMMAND) and\n    (\"download\" ne $sCOMMAND) and\n    (\"upload\" ne $sCOMMAND) and\n    (\"download-file\" ne $sCOMMAND) and\n    (\"upload-file\" ne $sCOMMAND) and\n    (\"backup\" ne $sCOMMAND) and\n    (\"restore\" ne $sCOMMAND) and\n    (\"sync\" ne $sCOMMAND)\n  )\n  {\n    &usage();\n  }\n    \n  if ( \"list\" eq $sCOMMAND )\n  {\n    &listConfigurations();\n  }\n    \n  if ( \"checksum\" eq $sCOMMAND )\n  {\n    &checksumConfiguration($sArg1);\n  }\n    \n  if ( \"delete\" eq $sCOMMAND )\n  {\n    &deleteConfiguration($sArg1);\n  }\n    \n  if ( \"save\" eq $sCOMMAND )\n  {\n    if ( \"\" eq $sArg1 )\n    {\n      $sArg1 = generateConfigName();\n    }\n    &saveConfiguration($sArg1, &saveModeFromArg($sArg2));\n  }\n    \n  if ( \"install\" eq $sCOMMAND )\n  {\n    &installConfiguration($sArg1);\n  }\n    \n  if ( \"rollback\" eq $sCOMMAND )\n  {\n    &rollbackConfiguration();\n  }\n    \n  if ( \"download\" eq $sCOMMAND )\n  {\n    &downloadConfiguration($sArg1, $sArg2);\n  }\n\n  if ( \"upload\" eq $sCOMMAND )\n  {\n    &uploadConfiguration($sArg1, $sArg2);\n  }\n\n  if ( \"download-file\" eq $sCOMMAND )\n  {\n    &downloadFile($sArg1, $sArg2);\n  }\n\n  if ( \"upload-file\" eq $sCOMMAND )\n  {\n    &uploadFile($sArg1, $sArg2);\n  }\n\n  if ( \"backup\" eq $sCOMMAND )\n  {\n    $configName = generateConfigName();\n    $localFile = $configName;\n\n    print \"Backing up configuration $configName\\n\";\n  \n    $success = &backupConfiguration($configName, $localFile, 1);\n    if ( 1 == $success )\n    {\n      print \"Backup succeeded\\n\";\n    }\n    else\n    {\n      print \"Backup failed\\n\";\n    }\n  }\n\n  if ( \"restore\" eq $sCOMMAND )\n  {\n    print \"Restoring configuration $sArg1\\n\";\n    $success = &restoreConfiguration($sArg1, 0, 1);\n    if ( 1 == $success )\n    {\n      print \"Restore succeeded\\n\";\n    }\n    else\n    {\n      print \"Restore failed\\n\";\n    }\n  }\n\n  if ( \"sync\" eq $sCOMMAND )\n  {\n    &syncConfiguration(&syncModeFromArg($sArg1));\n  }\n}\n\n#----------------------------------------------------------------------------\n# sub usage()\n#----------------------------------------------------------------------------\nsub usage()\n{\n  my ($subKey) = (@_);\n\n  print \"Usage: ConfigSync.pl host port uid pwd command [command_args]\\n\";\n  print \"    command\\n\";\n  print \"    --------\\n\";\n\n  if ( (\"\" eq $subKey) or (\"list\" eq $subKey) )\n  {\n    print \"    list\\n\";\n    print \"              Lists available configuration files on the server.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"checksum\" eq $subKey) )\n  {\n#    print \"    checksum  config_name\\n\";\n#    print \"              Retrieves the checksum for the given configuration file.\\n\";\n#    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"save\" eq $subKey) )\n  {\n    print \"    save      Creates a snapshot of the current configuration.\\n\";\n    print \"        Args: config_name [full | high | base]\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"install\" eq $subKey) )\n  {\n    print \"    install   Installs a given configuration file.\\n\";\n    print \"        Args: config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"rollback\" eq $subKey) )\n  {\n    print \"    rollback  Performs a rollback to the last loaded configuration.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"delete\" eq $subKey) )\n  {\n    print \"    delete    Deletes a given configuration file.\\n\";\n    print \"        Args: config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"download\" eq $subKey) )\n  {\n    print \"    download  Downloads a given configuration file from the server.\\n\";\n    print \"        Args: config_name local_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"upload\" eq $subKey) )\n  {\n    print \"    upload    Uploads a configuration to the server from the client machine.\\n\";\n    print \"        Args: local_file config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"download-file\" eq $subKey) )\n  {\n    print \"download-file Downloads a given file file from the server.\\n\";\n    print \"        Args: remote_file local_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"upload-file\" eq $subKey) )\n  {\n    print \"  upload-file Uploads a file to the server from the client machine.\\n\";\n    print \"        Args: local_file remote_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"sync\" eq $subKey) )\n  {\n    print \"    sync      Signals a configuration sync between HA devices.\\n\";\n    print \"        Args: [basic | running | all]\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"backup\" eq $subKey) )\n  {\n    print \"    backup    Saves configuration and downloads the configuration file.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"restore\" eq $subKey) )\n  {\n    print \"    restore   Restores a configuration from the client machine.\\n\";\n    print \"        Args: local_file\\n\";\n  }\n  exit(1);\n}\n\n#============================================================================\n#\n# Helper Methods\n#\n#============================================================================\n\n#----------------------------------------------------------------------------\n# sub generateConfigName\n#----------------------------------------------------------------------------\nsub generateConfigName()\n{\n  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\n  $year += 1900;\n  $sName = sprintf(\"%s-%04d%02d%02d_%02d%02d%02d.ucs\", $sHost, $year, $mon, $mday, $hour, $min, $sec);\n  return $sName;\n}\n\n#----------------------------------------------------------------------------\n# sub saveModeFromArg\n#----------------------------------------------------------------------------\nsub saveModeFromArg()\n{\n  my ($sSaveModeArg) = (@_);\n  my $sSaveMode = $SAVE_FULL;\n  \n  if ( (\"full\" ne $sSaveModeArg) and (\"high\" ne $sSaveModeArg) and (\"base\" ne $sSaveModeArg) )\n  {\n    $sSaveModeArg = \"full\";\n  }\n\n  if ( \"full\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_FULL;\n  }\n  elsif ( \"high\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_HIGH_LEVEL_CONFIG;\n  }\n  elsif ( \"base\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_BASE_LEVEL_CONFIG;\n  }\n  return $sSaveMode;\n}\n\n#----------------------------------------------------------------------------\n# syncModeFromArg\n#----------------------------------------------------------------------------\nsub syncModeFromArg()\n{\n  my $sSyncModeArg = @_;\n  my $sSyncMode = $CONFIGSYNC_ALL;\n\n  if ( (\"basic\" ne $sSyncModeArg) and (\"running\" ne $sSyncModeArg) and (\"all\" ne $sSyncModeArg) )\n  {\n    $sSyncModeArg = \"all\";\n  }\n  \n  if ( \"all\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_ALL;\n  }\n  if ( \"basic\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_BASIC;\n  }\n  if ( \"running\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_RUNNING;\n  }\n\n  return $sSyncMode;\n}\n\n\n#============================================================================\n#\n# Command Methods\n#\n#============================================================================\n\n#----------------------------------------------------------------------------\n# sub listConfigurations\n#----------------------------------------------------------------------------\nsub listConfigurations()\n{\n  $soap_response = $ConfigSync->get_configuration_list();\n  if ( $soap_response->fault )\n  {\n    print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n  }\n  else\n  {\n    my @ConfigFileEntryList = @{$soap_response->result};\n    print \"Available Configurations:\\n\";\n    my $configNumber = 0;\n    foreach my $ConfigFileEntry (@ConfigFileEntryList)\n    {\n      print \"    (\",\n        substr($ConfigFileEntry->{\"file_datetime\"}, 0, -1),\n        \") : '\",\n        $ConfigFileEntry->{\"file_name\"},\n        \"'\\n\";\n      $configNumber++;\n    }\n  }\n}\n\n#----------------------------------------------------------------------------\n# sub checksumConfiguration\n#----------------------------------------------------------------------------\nsub checksumConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"checksum\");\n  }\n\n  eval\n  {\n    $soap_response = $ConfigSync->get_configuration_checksum\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    $checksum = $soap_response->result;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$sConfigName' checksum: '$checksum'\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub deleteConfiguration\n#----------------------------------------------------------------------------\nsub deleteConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"delete\");\n  }\n  \n  eval\n  {\n    $soap_response = $ConfigSync->delete_configuration\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' deleted successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub saveConfiguration\n#----------------------------------------------------------------------------\nsub saveConfiguration()\n{\n  my ($configName, $saveMode, $quiet) = (@_);\n  my $success = 0;\n\n  if ( (\"\" eq $configName) or (\"\" eq $saveMode) )\n  {\n    &usage(\"save\");\n  }\n  \n  $soap_response = $ConfigSync->save_configuration\n  (\n    SOAP::Data->name(filename => $configName),\n    SOAP::Data->name(save_flag => $saveMode)\n  );\n  if ( $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' saved successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub installConfiguration\n#----------------------------------------------------------------------------\nsub installConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"install\");\n  }\n\n  eval\n  {\n    $soap_response = $ConfigSync->install_configuration\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' installed successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub rollbackConfiguration\n#----------------------------------------------------------------------------\nsub rollbackConfiguration()\n{\n  my ($quiet) = (@_);\n  my $success = 0;\n\n  eval\n  {\n    $soap_response = $ConfigSync->rollback_configuration();\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration rollback successful!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub downloadConfiguration\n#----------------------------------------------------------------------------\nsub downloadConfiguration()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"download\");\n  }\n\n  open (LOCAL_FILE, \">$localFile\") or die(\"Can't open $localFile for output: $!\");\n  binmode(LOCAL_FILE);\n\n  my $file_offset = 0;\n  my $chunk_size = $defaultChunkSize;\n  my $chain_type = $FILE_UNDEFINED;\n     my $bContinue = 1;\n\n     print \"\\n\";\n  while ( 1 == $bContinue )\n  {\n    $soap_response = $ConfigSync->download_configuration\n    (\n      SOAP::Data->name(config_name => $configName),\n      SOAP::Data->name(chunk_size => $chunk_size),\n      SOAP::Data->name(file_offset => $file_offset)\n    );\n\n    if ( $soap_response->fault )\n    {\n      if ( 1 != $quiet )\n      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n      }\n      $bContinue = 0;\n    }\n    else\n    {\n      $FileTransferContext = $soap_response->result;\n      $file_data = $FileTransferContext->{\"file_data\"};\n      $chain_type = $FileTransferContext->{\"chain_type\"};\n      @params = $soap_response->paramsout;\n      $file_offset = @params[0];\n\n      # Append Data to File\n      print LOCAL_FILE $file_data;\n\n#      if ( 1 != $quiet )\n#      {\n        print \"Bytes Transferred: $file_offset\\n\";\n#      }\n\n      if ( (\"FILE_LAST\" eq $chain_type) or\n           (\"FILE_FIRST_AND_LAST\" eq $chain_type) )\n      {\n        $bContinue = 0;\n        $success = 1;\n      }\n    }\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub uploadConfiguration\n#----------------------------------------------------------------------------\nsub uploadConfiguration()\n{\n  my ($localFile, $configName, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    $configName = $localFile;\n  }\n\n  if ( \"\" eq $localFile )\n  {\n    &usage(\"upload\");\n  }\n\n  $bContinue = 1;\n  $chain_type = $FILE_FIRST;\n  $preferred_chunk_size = $defaultChunkSize;\n  $chunk_size = $defaultChunkSize;\n  $total_bytes = 0;\n\n  open(LOCAL_FILE, \"<$localFile\") or die(\"Can't open $localFile for input: $!\");\n  binmode(LOCAL_FILE);\n\n  while (1 == $bContinue )\n  {\n    $file_data = \"\";\n    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);\n\n    if ( $preferred_chunk_size != $bytes_read )\n    {\n      if ( $total_bytes == 0 )\n      {\n        $chain_type = $FILE_FIRST_AND_LAST;\n      }\n      else\n      {\n        $chain_type = $FILE_LAST;\n      }\n      $bContinue = 0;\n    }\n    $total_bytes += $bytes_read;\n\n    $FileTransferContext =\n    {\n      file_data => SOAP::Data->type(base64 => $file_data),\n      chain_type => $chain_type\n    };\n\n\n    $soap_response = $ConfigSync->upload_configuration\n    (\n      SOAP::Data->name(config_name => $configName),\n      SOAP::Data->name(file_context => $FileTransferContext)\n    );\n\n    if ( $soap_response->fault )\n    {\n#      if ( 1 != $quiet )\n#      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n#      }\n      $success = 0;\n      $bContinue = 0;\n    }\n    else\n    {\n#      if ( 1 != $quiet )\n#      {\n        print \"Uploaded $total_bytes bytes\\n\";\n#      }\n      $success = 1;\n    }\n\n    $chain_type = $FILE_MIDDLE;\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub downloadFile\n#----------------------------------------------------------------------------\nsub downloadFile()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"download\");\n  }\n\n  open (LOCAL_FILE, \">$localFile\") or die(\"Can't open $localFile for output: $!\");\n  binmode(LOCAL_FILE);\n\n  my $file_offset = 0;\n  my $chunk_size = $defaultChunkSize;\n  my $chain_type = $FILE_UNDEFINED;\n     my $bContinue = 1;\n\n     print \"\\n\";\n  while ( 1 == $bContinue )\n  {\n    $soap_response = $ConfigSync->download_file\n    (\n      SOAP::Data->name(file_name => $configName),\n      SOAP::Data->name(chunk_size => $chunk_size),\n      SOAP::Data->name(file_offset => $file_offset)\n    );\n\n    if ( $soap_response->fault )\n    {\n      if ( 1 != $quiet )\n      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n      }\n      $bContinue = 0;\n    }\n    else\n    {\n      $FileTransferContext = $soap_response->result;\n      $file_data = $FileTransferContext->{\"file_data\"};\n      $chain_type = $FileTransferContext->{\"chain_type\"};\n      @params = $soap_response->paramsout;\n      $file_offset = @params[0];\n\n      # Append Data to File\n      print LOCAL_FILE $file_data;\n\n#      if ( 1 != $quiet )\n#      {\n        print \"Bytes Transferred: $file_offset\\n\";\n#      }\n\n      if ( (\"FILE_LAST\" eq $chain_type) or\n           (\"FILE_FIRST_AND_LAST\" eq $chain_type) )\n      {\n        $bContinue = 0;\n        $success = 1;\n      }\n    }\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub uploadFile\n#----------------------------------------------------------------------------\nsub uploadFile()\n{\n  my ($localFile, $configName, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    $configName = $localFile;\n  }\n\n  if ( \"\" eq $localFile )\n  {\n    &usage(\"upload\");\n  }\n\n  $bContinue = 1;\n  $chain_type = $FILE_FIRST;\n  $preferred_chunk_size = $defaultChunkSize;\n  $chunk_size = $defaultChunkSize;\n  $total_bytes = 0;\n\n  open(LOCAL_FILE, \"<$localFile\") or die(\"Can't open $localFile for input: $!\");\n  binmode(LOCAL_FILE);\n\n  while (1 == $bContinue )\n  {\n    $file_data = \"\";\n    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);\n\n    if ( $preferred_chunk_size != $bytes_read )\n    {\n      if ( $total_bytes == 0 )\n      {\n        $chain_type = $FILE_FIRST_AND_LAST;\n      }\n      else\n      {\n        $chain_type = $FILE_LAST;\n      }\n      $bContinue = 0;\n    }\n    $total_bytes += $bytes_read;\n\n    $FileTransferContext =\n    {\n      file_data => SOAP::Data->type(base64 => $file_data),\n      chain_type => $chain_type\n    };\n\n\n    $soap_response = $ConfigSync->upload_file\n    (\n      SOAP::Data->name(file_name => $configName),\n      SOAP::Data->name(file_context => $FileTransferContext)\n    );\n\n    if ( $soap_response->fault )\n    {\n#      if ( 1 != $quiet )\n#      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n#      }\n      $success = 0;\n      $bContinue = 0;\n    }\n    else\n    {\n#      if ( 1 != $quiet )\n#      {\n        print \"Uploaded $total_bytes bytes\\n\";\n#      }\n      $success = 1;\n    }\n\n    $chain_type = $FILE_MIDDLE;\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub syncConfiguration\n#----------------------------------------------------------------------------\nsub syncConfiguration()\n{\n  my ($syncFlag, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $syncFlag )\n  {\n    &usage(\"sync\");\n  }\n\n  $soap_response = $ConfigSync->synchronize_configuration\n  (\n    SOAP::Data->name(sync_flag => $syncFlag)\n  );\n  if ( $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration synchronized successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub backupConfiguration\n#----------------------------------------------------------------------------\nsub backupConfiguration()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n\n  if ( \"\" eq $configName )\n  {\n    $configName = generateConfigName();\n  }\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( (\"\" eq $configName) or (\"\" eq $localFile) )\n  {\n    &usage(\"backup\");\n  }\n\n  sleep(1);\n  $success = &saveConfiguration($configName, $SAVE_FULL, $quiet);\n  if ( 1 == $success )\n  {\n    sleep(1);\n    $success = &downloadConfiguration($configName, $localFile, $quiet);\n    if ( 1 == $success )\n    {\n      if ( 1 != $quiet )\n      {\n        print \"Configuration file $configName successfully backed up.\\n\";\n      }\n    }\n    sleep(1);\n    $success = &deleteConfiguration($configName, $quiet);\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub restoreConfiguration\n#----------------------------------------------------------------------------\nsub restoreConfiguration()\n{\n  my ($localFile, $doSync, $quiet) = (@_);\n\n  $configName = $localFile;\n\n  if ( (\"\" eq $configName) or (\"\" eq $localFile) )\n  {\n    &usage(\"restore\");\n  }\n\n  sleep(1);\n  $success = &uploadConfiguration($localFile, $configName, $quiet);\n  if ( 1 == $success )\n  {\n    sleep(1);\n    $success = &installConfiguration($configName, $quiet);\n    if ( 1 == $success )\n    {\n      if ( (\"1\" eq $doSync) or (\"y\" eq $doSync) or (\"Y\" eq $doSync) )\n      {\n        # Give server time to recover from restart.\n        sleep(5);\n        &syncConfiguration(&syncModeFromArg(\"all\"), $quiet);\n      }\n    }\n    sleep(1);\n    &deleteConfiguration($configName, $quiet);\n  }\n  return $success;\n}
","body@stringLength":"27986","rawBody":"

Problem this snippet solves:

This sample illustrates how to use the ConfigSync interfaces in perl.

Code :

#!/usr/bin/perl\n#----------------------------------------------------------------------------\n# The contents of this file are subject to the \"END USER LICENSE AGREEMENT FOR F5\n# Software Development Kit for iControl\"; you may not use this file except in\n# compliance with the License. The License is included in the iControl\n# Software Development Kit.\n#\n# Software distributed under the License is distributed on an \"AS IS\"\n# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n# the License for the specific language governing rights and limitations\n# under the License.\n#\n# The Original Code is iControl Code and related documentation\n# distributed by F5.\n#\n# The Initial Developer of the Original Code is F5 Networks,\n# Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2004 F5 Networks,\n# Inc. All Rights Reserved.  iControl (TM) is a registered trademark of F5 Networks, Inc.\n#\n# Alternatively, the contents of this file may be used under the terms\n# of the GNU General Public License (the \"GPL\"), in which case the\n# provisions of GPL are applicable instead of those above.  If you wish\n# to allow use of your version of this file only under the terms of the\n# GPL and not to allow others to use your version of this file under the\n# License, indicate your decision by deleting the provisions above and\n# replace them with the notice and other provisions required by the GPL.\n# If you do not delete the provisions above, a recipient may use your\n# version of this file under either the License or the GPL.\n#----------------------------------------------------------------------------\n\n#use SOAP::Lite + trace => qw(method debug);\nuse SOAP::Lite;\nuse MIME::Base64;\n\n$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;\n\n$| = 1;\n\nBEGIN { push (@INC, \"..\"); }\nuse iControlTypeCast;\n\n$sHost = $ARGV[0];\n$sPort = $ARGV[1];\n$sUID = $ARGV[2];\n$sPWD = $ARGV[3];\n$sCOMMAND = $ARGV[4];\n$sArg1 = $ARGV[5];\n$sArg2 = $ARGV[6];\n\n#----------------------------------------------------------------------------\n# Validate Arguments\n#----------------------------------------------------------------------------\n\nmy $sConfigName = \"\";\nmy $sLocalFile = \"\";\nmy $sSaveMode = \"\";\nmy $sProtocol;\nmy $defaultChunkSize = 65536/2;\n\nmy $FileChainType =\n{\n  0 => \"FILE_UNDEFINED\",\n  1 => \"FILE_FIRST\",\n  2 => \"FILE_MIDDLE\",\n  3 => \"FILE_UNUSED\",\n  4 => \"FILE_LAST\",\n  5 => \"FILE_FIRST_AND_LAST\",\n};\nmy $FileChainTypeValue =\n{\n  \"FILE_UNDEFINED\" => 0,\n  \"FILE_FIRST\" => 1,\n  \"FILE_MIDDLE\" => 2,\n  \"FILE_UNUSED\" => 3,\n  \"FILE_LAST\" => 4,\n  \"FILE_FIRST_AND_LAST\" => 5,\n};\n\nmy $FILE_UNDEFINED = \"FILE_UNDEFINED\";\nmy $FILE_FIRST = \"FILE_FIRST\";\nmy $FILE_MIDDLE = \"FILE_MIDDLE\";\nmy $FILE_UNUSED = \"FILE_UNUSED\";\nmy $FILE_LAST = \"FILE_LAST\";\nmy $FILE_FIRST_AND_LAST = \"FILE_FIRST_AND_LAST\";\n\nmy $SaveMode = \n{\n  0 => \"SAVE_FULL\",\n  1 => \"SAVE_HIGH_LEVEL_CONFIG\",\n  2 => \"SAVE_BASE_LEVEL_CONFIG\",\n};\nmy $SaveModeValue =\n{\n  \"SAVE_FULL\" => 0,\n  \"SAVE_HIGH_LEVEL_CONFIG\" => 1,\n  \"SAVE_BASE_LEVEL_CONFIG\" => 2,\n};\n\nmy $SAVE_FULL = \"SAVE_FULL\";\nmy $SAVE_HIGH_LEVEL_CONFIG = \"SAVE_HIGH_LEVEL_CONFIG\";\nmy $SAVE_BASE_LEVEL_CONFIG = \"SAVE_BASE_LEVEL_CONFIG\";\n\nmy $SyncMode =\n{\n  0 => \"CONFIGSYNC_BASIC\",\n  1 => \"CONFIGSYNC_RUNNING\",\n  2 => \"CONFIGSYNC_ALL\",\n};\nmy $SyncModeValue =\n{\n  \"CONFIGSYNC_BASIC\" => 0,\n  \"CONFIGSYNC_RUNNING\" => 1,\n  \"CONFIGSYNC_ALL\" => 2,\n};\n\nmy $CONFIGSYNC_BASIC = \"CONFIGSYNC_BASIC\";\nmy $CONFIGSYNC_RUNNING = \"CONFIGSYNC_RUNNING\";\nmy $CONFIGSYNC_ALL = \"CONFIGSYNC_ALL\";\n\n\n#----------------------------------------------------------------------------\n# Verify connection info\n#----------------------------------------------------------------------------\nif ( ($sHost eq \"\") or ($sUID eq \"\") or ($sPWD eq \"\") )\n{\n  &usage();\n}\n\nif ( ($sPort ne \"80\") and ($sPort ne \"8080\") )\n{\n  $sProtocol = \"https\";\n}\nelse\n{\n  $sProtocol = \"http\";\n}\n\n#----------------------------------------------------------------------------\n# Transport Information\n#----------------------------------------------------------------------------\nsub SOAP::Transport::HTTP::Client::get_basic_credentials\n{\n  return \"$sUID\" => \"$sPWD\";\n}\n\n$ConfigSync = SOAP::Lite\n  -> uri('urn:iControl:System/ConfigSync')\n  -> readable(1)\n  -> proxy(\"$sProtocol://$sHost:$sPort/iControl/iControlPortal.cgi\");\neval { $ConfigSync->transport->http_request->header\n(\n  'Authorization' => \n    'Basic ' . MIME::Base64::encode(\"$sUID:$sPWD\", '')\n); };\n\n&checkParameters(); \n\n\n#----------------------------------------------------------------------------\n# Get Command Parameters \n#----------------------------------------------------------------------------\nsub getParamsAndGo\n{\n  my $theCommandID = $_[0];\n  if ( 1 eq $theCommandID )\n  {\n    print \" Filename for configuration backup (empty for default): \";\n    chomp ($configName = );\n    if ( \"\" eq $configName )\n    {\n      $configName = generateConfigName();\n    }\n    $localFile = $sConfigName;\n\n    print \"Backing up configuration $configName\\n\";\n  \n    $success = &backupConfiguration($configName, $localFile, 1);\n    if ( 1 == $success )\n    {\n      print \"Backup succeeded\\n\";\n    }\n    else\n    {\n      print \"Backup failed\\n\";\n    }\n         \n  }\n  elsif ( 2 eq  $theCommandID)\n  {\n    print \" Config back up file to restore: \";\n    chomp ($sConfigName = );\n    print \" Sync devices after install? (y/n): \";\n    chomp ($sDoSync = );\n    $sLocalFile = $sConfigName;\n    $sSaveMode = \"full\";\n\n    print \"Restoring configuration $sLocalFile\\n\";\n    $success = &restoreConfiguration($sLocalFile, $sDoSync, 1);\n    if ( 1 == $success )\n    {\n      print \"Restore succeeded\\n\";\n    }\n    else\n    {\n      print \"Restore failed\\n\";\n    }\n  }\n  elsif ( 3 eq $theCommandID )\n  {\n    usage();\n  }\n  else\n  {\n    print \"Synching\\n\\n\";\n  }\n}\n\n#----------------------------------------------------------------------------\n# Check Parameters \n#----------------------------------------------------------------------------\nsub checkParameters\n{\n  if\n  (\n    (\"list\" ne $sCOMMAND) and\n    (\"checksum\" ne $sCOMMAND) and\n    (\"delete\" ne $sCOMMAND) and\n    (\"save\" ne $sCOMMAND) and\n    (\"install\" ne $sCOMMAND) and\n    (\"rollback\" ne $sCOMMAND) and\n    (\"download\" ne $sCOMMAND) and\n    (\"upload\" ne $sCOMMAND) and\n    (\"download-file\" ne $sCOMMAND) and\n    (\"upload-file\" ne $sCOMMAND) and\n    (\"backup\" ne $sCOMMAND) and\n    (\"restore\" ne $sCOMMAND) and\n    (\"sync\" ne $sCOMMAND)\n  )\n  {\n    &usage();\n  }\n    \n  if ( \"list\" eq $sCOMMAND )\n  {\n    &listConfigurations();\n  }\n    \n  if ( \"checksum\" eq $sCOMMAND )\n  {\n    &checksumConfiguration($sArg1);\n  }\n    \n  if ( \"delete\" eq $sCOMMAND )\n  {\n    &deleteConfiguration($sArg1);\n  }\n    \n  if ( \"save\" eq $sCOMMAND )\n  {\n    if ( \"\" eq $sArg1 )\n    {\n      $sArg1 = generateConfigName();\n    }\n    &saveConfiguration($sArg1, &saveModeFromArg($sArg2));\n  }\n    \n  if ( \"install\" eq $sCOMMAND )\n  {\n    &installConfiguration($sArg1);\n  }\n    \n  if ( \"rollback\" eq $sCOMMAND )\n  {\n    &rollbackConfiguration();\n  }\n    \n  if ( \"download\" eq $sCOMMAND )\n  {\n    &downloadConfiguration($sArg1, $sArg2);\n  }\n\n  if ( \"upload\" eq $sCOMMAND )\n  {\n    &uploadConfiguration($sArg1, $sArg2);\n  }\n\n  if ( \"download-file\" eq $sCOMMAND )\n  {\n    &downloadFile($sArg1, $sArg2);\n  }\n\n  if ( \"upload-file\" eq $sCOMMAND )\n  {\n    &uploadFile($sArg1, $sArg2);\n  }\n\n  if ( \"backup\" eq $sCOMMAND )\n  {\n    $configName = generateConfigName();\n    $localFile = $configName;\n\n    print \"Backing up configuration $configName\\n\";\n  \n    $success = &backupConfiguration($configName, $localFile, 1);\n    if ( 1 == $success )\n    {\n      print \"Backup succeeded\\n\";\n    }\n    else\n    {\n      print \"Backup failed\\n\";\n    }\n  }\n\n  if ( \"restore\" eq $sCOMMAND )\n  {\n    print \"Restoring configuration $sArg1\\n\";\n    $success = &restoreConfiguration($sArg1, 0, 1);\n    if ( 1 == $success )\n    {\n      print \"Restore succeeded\\n\";\n    }\n    else\n    {\n      print \"Restore failed\\n\";\n    }\n  }\n\n  if ( \"sync\" eq $sCOMMAND )\n  {\n    &syncConfiguration(&syncModeFromArg($sArg1));\n  }\n}\n\n#----------------------------------------------------------------------------\n# sub usage()\n#----------------------------------------------------------------------------\nsub usage()\n{\n  my ($subKey) = (@_);\n\n  print \"Usage: ConfigSync.pl host port uid pwd command [command_args]\\n\";\n  print \"    command\\n\";\n  print \"    --------\\n\";\n\n  if ( (\"\" eq $subKey) or (\"list\" eq $subKey) )\n  {\n    print \"    list\\n\";\n    print \"              Lists available configuration files on the server.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"checksum\" eq $subKey) )\n  {\n#    print \"    checksum  config_name\\n\";\n#    print \"              Retrieves the checksum for the given configuration file.\\n\";\n#    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"save\" eq $subKey) )\n  {\n    print \"    save      Creates a snapshot of the current configuration.\\n\";\n    print \"        Args: config_name [full | high | base]\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"install\" eq $subKey) )\n  {\n    print \"    install   Installs a given configuration file.\\n\";\n    print \"        Args: config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"rollback\" eq $subKey) )\n  {\n    print \"    rollback  Performs a rollback to the last loaded configuration.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"delete\" eq $subKey) )\n  {\n    print \"    delete    Deletes a given configuration file.\\n\";\n    print \"        Args: config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"download\" eq $subKey) )\n  {\n    print \"    download  Downloads a given configuration file from the server.\\n\";\n    print \"        Args: config_name local_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"upload\" eq $subKey) )\n  {\n    print \"    upload    Uploads a configuration to the server from the client machine.\\n\";\n    print \"        Args: local_file config_name\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"download-file\" eq $subKey) )\n  {\n    print \"download-file Downloads a given file file from the server.\\n\";\n    print \"        Args: remote_file local_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"upload-file\" eq $subKey) )\n  {\n    print \"  upload-file Uploads a file to the server from the client machine.\\n\";\n    print \"        Args: local_file remote_file\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"sync\" eq $subKey) )\n  {\n    print \"    sync      Signals a configuration sync between HA devices.\\n\";\n    print \"        Args: [basic | running | all]\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"backup\" eq $subKey) )\n  {\n    print \"    backup    Saves configuration and downloads the configuration file.\\n\";\n    print \"        Args: None\\n\";\n    print \"\\n\";\n  }\n  if ( (\"\" eq $subKey) or (\"restore\" eq $subKey) )\n  {\n    print \"    restore   Restores a configuration from the client machine.\\n\";\n    print \"        Args: local_file\\n\";\n  }\n  exit(1);\n}\n\n#============================================================================\n#\n# Helper Methods\n#\n#============================================================================\n\n#----------------------------------------------------------------------------\n# sub generateConfigName\n#----------------------------------------------------------------------------\nsub generateConfigName()\n{\n  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\n  $year += 1900;\n  $sName = sprintf(\"%s-%04d%02d%02d_%02d%02d%02d.ucs\", $sHost, $year, $mon, $mday, $hour, $min, $sec);\n  return $sName;\n}\n\n#----------------------------------------------------------------------------\n# sub saveModeFromArg\n#----------------------------------------------------------------------------\nsub saveModeFromArg()\n{\n  my ($sSaveModeArg) = (@_);\n  my $sSaveMode = $SAVE_FULL;\n  \n  if ( (\"full\" ne $sSaveModeArg) and (\"high\" ne $sSaveModeArg) and (\"base\" ne $sSaveModeArg) )\n  {\n    $sSaveModeArg = \"full\";\n  }\n\n  if ( \"full\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_FULL;\n  }\n  elsif ( \"high\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_HIGH_LEVEL_CONFIG;\n  }\n  elsif ( \"base\" eq $sSaveModeArg )\n  {\n    $sSaveMode = $SAVE_BASE_LEVEL_CONFIG;\n  }\n  return $sSaveMode;\n}\n\n#----------------------------------------------------------------------------\n# syncModeFromArg\n#----------------------------------------------------------------------------\nsub syncModeFromArg()\n{\n  my $sSyncModeArg = @_;\n  my $sSyncMode = $CONFIGSYNC_ALL;\n\n  if ( (\"basic\" ne $sSyncModeArg) and (\"running\" ne $sSyncModeArg) and (\"all\" ne $sSyncModeArg) )\n  {\n    $sSyncModeArg = \"all\";\n  }\n  \n  if ( \"all\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_ALL;\n  }\n  if ( \"basic\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_BASIC;\n  }\n  if ( \"running\" eq $sSyncModeArg )\n  {\n    $sSyncMode = $CONFIGSYNC_RUNNING;\n  }\n\n  return $sSyncMode;\n}\n\n\n#============================================================================\n#\n# Command Methods\n#\n#============================================================================\n\n#----------------------------------------------------------------------------\n# sub listConfigurations\n#----------------------------------------------------------------------------\nsub listConfigurations()\n{\n  $soap_response = $ConfigSync->get_configuration_list();\n  if ( $soap_response->fault )\n  {\n    print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n  }\n  else\n  {\n    my @ConfigFileEntryList = @{$soap_response->result};\n    print \"Available Configurations:\\n\";\n    my $configNumber = 0;\n    foreach my $ConfigFileEntry (@ConfigFileEntryList)\n    {\n      print \"    (\",\n        substr($ConfigFileEntry->{\"file_datetime\"}, 0, -1),\n        \") : '\",\n        $ConfigFileEntry->{\"file_name\"},\n        \"'\\n\";\n      $configNumber++;\n    }\n  }\n}\n\n#----------------------------------------------------------------------------\n# sub checksumConfiguration\n#----------------------------------------------------------------------------\nsub checksumConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"checksum\");\n  }\n\n  eval\n  {\n    $soap_response = $ConfigSync->get_configuration_checksum\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    $checksum = $soap_response->result;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$sConfigName' checksum: '$checksum'\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub deleteConfiguration\n#----------------------------------------------------------------------------\nsub deleteConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"delete\");\n  }\n  \n  eval\n  {\n    $soap_response = $ConfigSync->delete_configuration\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' deleted successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub saveConfiguration\n#----------------------------------------------------------------------------\nsub saveConfiguration()\n{\n  my ($configName, $saveMode, $quiet) = (@_);\n  my $success = 0;\n\n  if ( (\"\" eq $configName) or (\"\" eq $saveMode) )\n  {\n    &usage(\"save\");\n  }\n  \n  $soap_response = $ConfigSync->save_configuration\n  (\n    SOAP::Data->name(filename => $configName),\n    SOAP::Data->name(save_flag => $saveMode)\n  );\n  if ( $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' saved successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub installConfiguration\n#----------------------------------------------------------------------------\nsub installConfiguration()\n{\n  my ($configName, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"install\");\n  }\n\n  eval\n  {\n    $soap_response = $ConfigSync->install_configuration\n    (\n      SOAP::Data->name(filename => $configName)\n    );\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration '$configName' installed successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub rollbackConfiguration\n#----------------------------------------------------------------------------\nsub rollbackConfiguration()\n{\n  my ($quiet) = (@_);\n  my $success = 0;\n\n  eval\n  {\n    $soap_response = $ConfigSync->rollback_configuration();\n  };\n\n  if ( $soap_response and $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration rollback successful!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub downloadConfiguration\n#----------------------------------------------------------------------------\nsub downloadConfiguration()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"download\");\n  }\n\n  open (LOCAL_FILE, \">$localFile\") or die(\"Can't open $localFile for output: $!\");\n  binmode(LOCAL_FILE);\n\n  my $file_offset = 0;\n  my $chunk_size = $defaultChunkSize;\n  my $chain_type = $FILE_UNDEFINED;\n     my $bContinue = 1;\n\n     print \"\\n\";\n  while ( 1 == $bContinue )\n  {\n    $soap_response = $ConfigSync->download_configuration\n    (\n      SOAP::Data->name(config_name => $configName),\n      SOAP::Data->name(chunk_size => $chunk_size),\n      SOAP::Data->name(file_offset => $file_offset)\n    );\n\n    if ( $soap_response->fault )\n    {\n      if ( 1 != $quiet )\n      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n      }\n      $bContinue = 0;\n    }\n    else\n    {\n      $FileTransferContext = $soap_response->result;\n      $file_data = $FileTransferContext->{\"file_data\"};\n      $chain_type = $FileTransferContext->{\"chain_type\"};\n      @params = $soap_response->paramsout;\n      $file_offset = @params[0];\n\n      # Append Data to File\n      print LOCAL_FILE $file_data;\n\n#      if ( 1 != $quiet )\n#      {\n        print \"Bytes Transferred: $file_offset\\n\";\n#      }\n\n      if ( (\"FILE_LAST\" eq $chain_type) or\n           (\"FILE_FIRST_AND_LAST\" eq $chain_type) )\n      {\n        $bContinue = 0;\n        $success = 1;\n      }\n    }\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub uploadConfiguration\n#----------------------------------------------------------------------------\nsub uploadConfiguration()\n{\n  my ($localFile, $configName, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    $configName = $localFile;\n  }\n\n  if ( \"\" eq $localFile )\n  {\n    &usage(\"upload\");\n  }\n\n  $bContinue = 1;\n  $chain_type = $FILE_FIRST;\n  $preferred_chunk_size = $defaultChunkSize;\n  $chunk_size = $defaultChunkSize;\n  $total_bytes = 0;\n\n  open(LOCAL_FILE, \"<$localFile\") or die(\"Can't open $localFile for input: $!\");\n  binmode(LOCAL_FILE);\n\n  while (1 == $bContinue )\n  {\n    $file_data = \"\";\n    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);\n\n    if ( $preferred_chunk_size != $bytes_read )\n    {\n      if ( $total_bytes == 0 )\n      {\n        $chain_type = $FILE_FIRST_AND_LAST;\n      }\n      else\n      {\n        $chain_type = $FILE_LAST;\n      }\n      $bContinue = 0;\n    }\n    $total_bytes += $bytes_read;\n\n    $FileTransferContext =\n    {\n      file_data => SOAP::Data->type(base64 => $file_data),\n      chain_type => $chain_type\n    };\n\n\n    $soap_response = $ConfigSync->upload_configuration\n    (\n      SOAP::Data->name(config_name => $configName),\n      SOAP::Data->name(file_context => $FileTransferContext)\n    );\n\n    if ( $soap_response->fault )\n    {\n#      if ( 1 != $quiet )\n#      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n#      }\n      $success = 0;\n      $bContinue = 0;\n    }\n    else\n    {\n#      if ( 1 != $quiet )\n#      {\n        print \"Uploaded $total_bytes bytes\\n\";\n#      }\n      $success = 1;\n    }\n\n    $chain_type = $FILE_MIDDLE;\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub downloadFile\n#----------------------------------------------------------------------------\nsub downloadFile()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( \"\" eq $configName )\n  {\n    &usage(\"download\");\n  }\n\n  open (LOCAL_FILE, \">$localFile\") or die(\"Can't open $localFile for output: $!\");\n  binmode(LOCAL_FILE);\n\n  my $file_offset = 0;\n  my $chunk_size = $defaultChunkSize;\n  my $chain_type = $FILE_UNDEFINED;\n     my $bContinue = 1;\n\n     print \"\\n\";\n  while ( 1 == $bContinue )\n  {\n    $soap_response = $ConfigSync->download_file\n    (\n      SOAP::Data->name(file_name => $configName),\n      SOAP::Data->name(chunk_size => $chunk_size),\n      SOAP::Data->name(file_offset => $file_offset)\n    );\n\n    if ( $soap_response->fault )\n    {\n      if ( 1 != $quiet )\n      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n      }\n      $bContinue = 0;\n    }\n    else\n    {\n      $FileTransferContext = $soap_response->result;\n      $file_data = $FileTransferContext->{\"file_data\"};\n      $chain_type = $FileTransferContext->{\"chain_type\"};\n      @params = $soap_response->paramsout;\n      $file_offset = @params[0];\n\n      # Append Data to File\n      print LOCAL_FILE $file_data;\n\n#      if ( 1 != $quiet )\n#      {\n        print \"Bytes Transferred: $file_offset\\n\";\n#      }\n\n      if ( (\"FILE_LAST\" eq $chain_type) or\n           (\"FILE_FIRST_AND_LAST\" eq $chain_type) )\n      {\n        $bContinue = 0;\n        $success = 1;\n      }\n    }\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub uploadFile\n#----------------------------------------------------------------------------\nsub uploadFile()\n{\n  my ($localFile, $configName, $quiet) = (@_);\n  $success = 0;\n\n  if ( \"\" eq $configName )\n  {\n    $configName = $localFile;\n  }\n\n  if ( \"\" eq $localFile )\n  {\n    &usage(\"upload\");\n  }\n\n  $bContinue = 1;\n  $chain_type = $FILE_FIRST;\n  $preferred_chunk_size = $defaultChunkSize;\n  $chunk_size = $defaultChunkSize;\n  $total_bytes = 0;\n\n  open(LOCAL_FILE, \"<$localFile\") or die(\"Can't open $localFile for input: $!\");\n  binmode(LOCAL_FILE);\n\n  while (1 == $bContinue )\n  {\n    $file_data = \"\";\n    $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size);\n\n    if ( $preferred_chunk_size != $bytes_read )\n    {\n      if ( $total_bytes == 0 )\n      {\n        $chain_type = $FILE_FIRST_AND_LAST;\n      }\n      else\n      {\n        $chain_type = $FILE_LAST;\n      }\n      $bContinue = 0;\n    }\n    $total_bytes += $bytes_read;\n\n    $FileTransferContext =\n    {\n      file_data => SOAP::Data->type(base64 => $file_data),\n      chain_type => $chain_type\n    };\n\n\n    $soap_response = $ConfigSync->upload_file\n    (\n      SOAP::Data->name(file_name => $configName),\n      SOAP::Data->name(file_context => $FileTransferContext)\n    );\n\n    if ( $soap_response->fault )\n    {\n#      if ( 1 != $quiet )\n#      {\n        print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n#      }\n      $success = 0;\n      $bContinue = 0;\n    }\n    else\n    {\n#      if ( 1 != $quiet )\n#      {\n        print \"Uploaded $total_bytes bytes\\n\";\n#      }\n      $success = 1;\n    }\n\n    $chain_type = $FILE_MIDDLE;\n  }\n  print \"\\n\";\n\n  close(LOCAL_FILE);\n\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub syncConfiguration\n#----------------------------------------------------------------------------\nsub syncConfiguration()\n{\n  my ($syncFlag, $quiet) = (@_);\n  my $success = 0;\n\n  if ( \"\" eq $syncFlag )\n  {\n    &usage(\"sync\");\n  }\n\n  $soap_response = $ConfigSync->synchronize_configuration\n  (\n    SOAP::Data->name(sync_flag => $syncFlag)\n  );\n  if ( $soap_response->fault )\n  {\n    if ( 1 != $quiet )\n    {\n      print $soap_response->faultcode, \" \", $soap_response->faultstring, \"\\n\";\n    }\n  }\n  else\n  {\n    $success = 1;\n    if ( 1 != $quiet )\n    {\n      print \"Configuration synchronized successfully!\\n\";\n    }\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub backupConfiguration\n#----------------------------------------------------------------------------\nsub backupConfiguration()\n{\n  my ($configName, $localFile, $quiet) = (@_);\n\n  if ( \"\" eq $configName )\n  {\n    $configName = generateConfigName();\n  }\n  if ( \"\" eq $localFile )\n  {\n    $localFile = $configName;\n  }\n\n  if ( (\"\" eq $configName) or (\"\" eq $localFile) )\n  {\n    &usage(\"backup\");\n  }\n\n  sleep(1);\n  $success = &saveConfiguration($configName, $SAVE_FULL, $quiet);\n  if ( 1 == $success )\n  {\n    sleep(1);\n    $success = &downloadConfiguration($configName, $localFile, $quiet);\n    if ( 1 == $success )\n    {\n      if ( 1 != $quiet )\n      {\n        print \"Configuration file $configName successfully backed up.\\n\";\n      }\n    }\n    sleep(1);\n    $success = &deleteConfiguration($configName, $quiet);\n  }\n  return $success;\n}\n\n#----------------------------------------------------------------------------\n# sub restoreConfiguration\n#----------------------------------------------------------------------------\nsub restoreConfiguration()\n{\n  my ($localFile, $doSync, $quiet) = (@_);\n\n  $configName = $localFile;\n\n  if ( (\"\" eq $configName) or (\"\" eq $localFile) )\n  {\n    &usage(\"restore\");\n  }\n\n  sleep(1);\n  $success = &uploadConfiguration($localFile, $configName, $quiet);\n  if ( 1 == $success )\n  {\n    sleep(1);\n    $success = &installConfiguration($configName, $quiet);\n    if ( 1 == $success )\n    {\n      if ( (\"1\" eq $doSync) or (\"y\" eq $doSync) or (\"Y\" eq $doSync) )\n      {\n        # Give server time to recover from restart.\n        sleep(5);\n        &syncConfiguration(&syncModeFromArg(\"all\"), $quiet);\n      }\n    }\n    sleep(1);\n    &deleteConfiguration($configName, $quiet);\n  }\n  return $success;\n}
","kudosSumWeight":0,"postTime":"2015-03-07T16:43:45.000-08:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuM3wyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:devops","text":"devops","time":"2011-10-19T17:50:55.000-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuM3wyLjF8b3wxMHxfTlZffDI","node":{"__typename":"Tag","id":"tag:iControl","text":"iControl","time":"2022-01-24T02:29:45.068-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuM3wyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:perl","text":"perl","time":"2022-01-24T02:31:41.712-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":12,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:277926_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":237},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[{"__typename":"UserEdge","node":{"__ref":"User:user:131293"}}]},"tkbMessagePolicies":{"__typename":"TkbMessagePolicies","canDoAuthoringActionsOnTkb":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","key":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":1}},"Conversation:conversation:277926":{"__typename":"Conversation","id":"conversation:277926","solved":false,"topic":{"__ref":"TkbTopicMessage:message:277926"},"lastPostingActivityTime":"2015-03-07T16:43:45.000-08:00","lastPostTime":"2015-03-07T16:43:45.000-08:00","unreadReplyCount":0,"isSubscribed":false},"ModerationData:moderation_data:277926":{"__typename":"ModerationData","id":"moderation_data:277926","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"Revision:revision:277926_1":{"__typename":"Revision","id":"revision:277926_1","lastEditTime":"2015-03-07T16:43:45.000-08:00"},"CachedAsset:theme:customTheme1-1746692021721":{"__typename":"CachedAsset","id":"theme:customTheme1-1746692021721","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","defaultMessageFontFamily":"var(--lia-bs-font-family-base)","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1744046271000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1746692019701":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:codeshare-1746692019701","value":{"id":"TkbMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"message-list","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":true,"showDescription":true,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[{"id":"tkbs.widget.tkbArticleWidget","className":"lia-tkb-container","props":{"contributorListType":"panel","showHelpfulness":false,"showTimestamp":true,"showGuideNavigationSection":true,"showVersion":true,"lazyLoad":false,"editLevel":"CONFIGURE"},"__typename":"QuiltComponent"}],"side":[{"id":"featuredWidgets.widget.featuredContentWidget","className":null,"props":{"instanceId":"featuredWidgets.widget.featuredContentWidget-1702666556326","layoutProps":{"layout":"card","layoutOptions":{"useRepliesCount":false,"useAuthorRank":false,"useTimeToRead":true,"useKudosCount":false,"useViewCount":true,"usePreviewMedia":true,"useBody":false,"useCenteredCardContent":false,"useTags":true,"useTimestamp":false,"useBoardLink":true,"useAuthorLink":false,"useSolvedBadge":true}},"titleSrOnly":false,"showPager":true,"pageSize":3,"lazyLoad":true},"__typename":"QuiltComponent"},{"id":"messages.widget.relatedContentWidget","className":null,"props":{"hideIfEmpty":true,"enablePagination":true,"useTitle":true,"listVariant":{"type":"listGroup"},"pageSize":3,"style":"list","pagerVariant":{"type":"loadMore"},"viewVariant":{"type":"inline","props":{"useRepliesCount":true,"useMedia":true,"useAuthorRank":false,"useNode":true,"useTimeToRead":true,"useSpoilerFreeBody":true,"useKudosCount":true,"useNodeLink":true,"useViewCount":true,"usePreviewMedia":false,"useBody":false,"timeStampType":"postTime","useTags":true,"clampSubjectLines":2,"useBoardIcon":false,"useMessageTimeLink":true,"clampBodyLines":3,"useTextBody":true,"useSolvedBadge":true,"useAvatar":true,"useAuthorLogin":true,"useUnreadCount":true}},"lazyLoad":true,"panelType":"divider"},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1744046271000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-pages/kbs/TkbMessagePage-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1744046271000","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This article cannot be found","name":"TKB Message Page","section.message-list.title":"","archivedMessageTitle":"This Content Has Been Archived","section.erPqcf.title":"","section.erPqcf.description":"","section.message-list.description":""},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1746691975667":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1746691975667","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.GainsightShared","props":{"widgetVisibility":"signedInOnly","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"},{"children":[],"linkType":"EXTERNAL","id":"Common-external-link","url":"https://community.f5.com/c/how-do-i","target":"SELF"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1744046271000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.GainsightShared-en-us-1746692041012":{"__typename":"CachedAsset","id":"component:custom.widget.GainsightShared-en-us-1746692041012","value":{"component":{"id":"custom.widget.GainsightShared","template":{"id":"GainsightShared","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.GainsightShared","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Shared functions for Gainsight integration","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-us-1746692041012":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-us-1746692041012","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-us-1746692041012":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-us-1746692041012","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-us-1746692041012":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-us-1746692041012","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-us-1746692041012":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-us-1746692041012","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":{},"defaults":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1744046271000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1744046271000","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"CachedAsset:text:en_US-components/tkbs/TkbArticleWidget-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1744046271000","value":{},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:277926:1":{"__typename":"QueryVariables","id":"TopicReplyList:message:277926:1","value":{"id":"message:277926","first":10,"sorts":{"postTime":{"direction":"ASC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"ASC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/community/Navbar-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1744046271000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","Common-external-link":"How Do I...?","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1744046271000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1744046271000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1744046271000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1744046271000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1744046271000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1744046271000","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solution","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1744046271000","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1744046271000","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1744046271000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1744046271000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1744046271000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1744046271000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1744046271000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1744046271000","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1744046271000","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1744046271000","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1744046271000","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1744046271000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1744046271000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1744046271000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1744046271000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1744046271000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1744046271000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1744046271000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1744046271000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"codeshare","messageSubject":"perl-config-sync","messageId":"277926"},"buildId":"-gVUpXaWnPcjlrLJZ92B7","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"25.3.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tkbs/TkbArticleWidget/TkbArticleWidget.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","./components/customComponent/CustomComponentContent/TemplateContent.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx","./components/customComponent/CustomComponentContent/HtmlContent.tsx","./components/customComponent/CustomComponentContent/CustomComponentScripts.tsx"],"appGip":true,"scriptLoader":[]}