Skip to content

File broker_admin.c

File List > broker > broker_admin.c

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */


/*
 * broker_admin.c -
 */

#ident "$Id$"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>

#if defined(WINDOWS)
#include <direct.h>
#endif /* WINDOWS */

#include "cas_common.h"
#include "broker_admin_pub.h"
#include "broker_config.h"
#include "broker_shm.h"
#include "broker_error.h"
#include "system_parameter.h"

#include "broker_util.h"
#include "util_func.h"
#if defined(WINDOWS)
#include "broker_wsa_init.h"
#endif /* WINDOWS */

#define TRUE            1
#define FALSE           0

static void
admin_log_write (const char *log_file, const char *msg)
{
  FILE *fp;
  struct tm ct;
  time_t ts;

  fp = fopen (log_file, "a");
  if (fp != NULL)
    {
      ts = time (NULL);
      memset (&ct, 0x0, sizeof (struct tm));
      localtime_r (&ts, &ct);
      fprintf (fp, "%d/%02d/%02d %02d:%02d:%02d %s\n", ct.tm_year + 1900, ct.tm_mon + 1, ct.tm_mday, ct.tm_hour,
           ct.tm_min, ct.tm_sec, msg);
      fclose (fp);
    }
  else
    {
      printf ("cannot open admin log file [%s]\n", log_file);
    }
}

int
main (int argc, char **argv)
{
  T_BROKER_INFO br_info[MAX_BROKER_NUM];
  char admin_log_file[BROKER_PATH_MAX];
  char acl_file[BROKER_PATH_MAX];
  bool acl_flag, acl_default_policy;
  int num_broker, master_shm_id;
  int err;
  char msg_buf[256];

  if (argc == 2 && strcmp (argv[1], "--version") == 0)
    {
      printf ("VERSION %s\n", makestring (BUILD_NUMBER));
      return 0;
    }

  er_init (NULL, ER_NEVER_EXIT);

  /* change the working directory to $CUBRID */
  ut_cd_root_dir ();

  if (sysprm_load_and_init (NULL, NULL, SYSPRM_IGNORE_INTL_PARAMS) != NO_ERROR)
    {
      fprintf (stderr, "System Parameter load failed.");
      return 0;
    }

  err =
    broker_config_read (NULL, br_info, &num_broker, &master_shm_id, admin_log_file, 0, &acl_flag, acl_file,
            &acl_default_policy, NULL);
  if (err < 0)
    {
#if defined (FOR_ODBC_GATEWAY)
      util_log_write_errstr ("gateway config read error.\n");
#else
      util_log_write_errstr ("broker config read error.\n");
#endif
      return -1;
    }

  /* change the working directory to $CUBRID/bin */
  ut_cd_work_dir ();

  if (argc < 2)
    {
      goto usage;
    }

#if defined(WINDOWS)
  if (wsa_initialize () < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("WSA init error\n");
      return 0;
    }
#endif /* WINDOWS */

#if 0
  if (admin_get_host_ip ())
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
#endif
  admin_err_msg[0] = '\0';

  admin_init_env ();

  if (strcasecmp (argv[1], "start") == 0)
    {
      T_SHM_BROKER *shm_br;

#ifdef ORACLE
      if (check_key () == FALSE)
    {
      return -1;
    }
#endif

      shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_MONITOR);

      if (shm_br == NULL && uw_get_error_code () != UW_ER_SHM_OPEN_MAGIC)
    {
      if (admin_start_cmd
          (br_info, num_broker, master_shm_id, acl_flag, acl_file, acl_default_policy, admin_log_file) < 0)
        {
          PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
          return -1;
        }
      else
        {
          admin_log_write (admin_log_file, "start");
        }
    }
      else
    {
      PRINT_AND_LOG_ERR_MSG ("Error: CUBRID Broker is already running " "with shared memory key '%x'.\n",
                 master_shm_id);
      uw_shm_detach (shm_br);
    }
    }
  else if (strcasecmp (argv[1], "stop") == 0)
    {
      if (admin_stop_cmd (master_shm_id))
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      admin_log_write (admin_log_file, "stop");
    }
    }
  else if (strcasecmp (argv[1], "add") == 0)
    {
      if (argc < 3)
    {
      PRINT_AND_LOG_ERR_MSG ("%s add <broker-name>\n", argv[0]);
      return -1;
    }
      if (admin_add_cmd (master_shm_id, argv[2]) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "add %s", argv[2]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "restart") == 0)
    {
      if (argc < 4)
    {
      PRINT_AND_LOG_ERR_MSG ("%s restart <broker-name> <appl_server_index>\n", argv[0]);
      return -1;
    }
      if (admin_restart_cmd (master_shm_id, argv[2], atoi (argv[3])) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "restart %s %s", argv[2], argv[3]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "drop") == 0)
    {
      if (argc < 3)
    {
      PRINT_AND_LOG_ERR_MSG ("%s drop <broker-name>\n", argv[0]);
      return -1;
    }
      if (admin_drop_cmd (master_shm_id, argv[2]) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "drop %s", argv[2]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "on") == 0)
    {
      if (argc < 3)
    {
      PRINT_AND_LOG_ERR_MSG ("%s on <broker-name>\n", argv[0]);
      return -1;
    }
      if (admin_on_cmd (master_shm_id, argv[2]) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "%s on", argv[2]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "off") == 0)
    {
      if (argc < 3)
    {
      PRINT_AND_LOG_ERR_MSG ("%s on <broker-name>\n", argv[0]);
      return -1;
    }
      if (admin_off_cmd (master_shm_id, argv[2]) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "%s off", argv[2]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "reset") == 0)
    {
      if (argc < 3)
    {
      PRINT_AND_LOG_ERR_MSG ("%s reset <broker-name>\n", argv[0]);
      return -1;
    }
      if (admin_reset_cmd (master_shm_id, argv[2]) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      sprintf (msg_buf, "%s reset", argv[2]);
      admin_log_write (admin_log_file, msg_buf);
    }
    }
  else if (strcasecmp (argv[1], "info") == 0)
    {
      if (admin_info_cmd (master_shm_id) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
      else
    {
      admin_log_write (admin_log_file, "info");
    }
    }
  else if (strcasecmp (argv[1], "acl") == 0)
    {
      char *br_name = NULL;
      int err_code;

      if (argc < 3)
    {
#if defined (FOR_ODBC_GATEWAY)
      PRINT_AND_LOG_ERR_MSG ("%s acl <reload|status> <gateway-name>\n", argv[0]);
#else
      PRINT_AND_LOG_ERR_MSG ("%s acl <reload|status> <broker-name>\n", argv[0]);
#endif
      return -1;
    }

      if (argc > 3)
    {
      br_name = argv[3];
    }

      if (strcasecmp (argv[2], "reload") == 0)
    {
      err_code = admin_acl_reload_cmd (master_shm_id, br_name);
    }
      else if (strcasecmp (argv[2], "status") == 0)
    {
      err_code = admin_acl_status_cmd (master_shm_id, br_name);
    }
      else
    {
#if defined (FOR_ODBC_GATEWAY)
      PRINT_AND_LOG_ERR_MSG ("%s acl <reload|status> <gateway-name>\n", argv[0]);
#else
      PRINT_AND_LOG_ERR_MSG ("%s acl <reload|status> <broker-name>\n", argv[0]);
#endif
      return -1;
    }
      if (err_code < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
    }
  else if (strcasecmp (argv[1], "getid") == 0)
    {
      if (admin_getid_cmd (master_shm_id, argc, (const char **) argv) < 0)
    {
      PRINT_AND_LOG_ERR_MSG ("%s\n", admin_err_msg);
      return -1;
    }
    }
  else
    {
      goto usage;
    }
  er_final (ER_ALL_FINAL);
  return 0;

usage:
  printf ("%s (start | stop | add | drop | restart \
        | on | off | reset | info | acl | getid)\n", argv[0]);
  return -1;
}