*----------------------------------------------------------------------*
* Setup for the ABAP Virus Scan Interface                              *
*----------------------------------------------------------------------*
REPORT  zvsisetup.

TYPE-POOLS:
  abap.

PARAMETERS: vsa_lib TYPE vscan_server_vsa_lib,
            group   TYPE string DEFAULT 'DEFAULT',
            profile TYPE string DEFAULT 'ZDEFAULT'.


DATA:
  gf_cursor_field(20) TYPE c,
  gf_okcode(20)       TYPE c,
  gf_rc               TYPE i,
  gf_msg_buf          TYPE string,
  gf_exception        TYPE abap_bool,
  gf_data             TYPE xstring,
  lf_blob             TYPE xstring,
  gf_data_clean       TYPE xstring,
  ls_vscan_group      TYPE vscan_group,
  ls_vscan_server     TYPE vscan_server,
  ls_vscan_prof       TYPE vscan_prof,
  ls_vscan_step       TYPE vscan_prof_grp,
  ls_vscan_param      TYPE vscan_prof_par,
  lt_vscan_profs      TYPE TABLE OF vscan_prof,
  bvscangroup(1)      TYPE c VALUE ' ',
  bvscanserver(1)     TYPE c VALUE ' ',
  bzvscanprof(1)      TYPE c VALUE ' ',
  lo_vsa              TYPE REF TO cl_vscan_adapter.


* Get the data from the instance
DATA:
  lf_regex       TYPE string,
  ls_vsa_info    TYPE vscan_rfc_vsa_info,
  ls_server_info TYPE vscan_rfc_server_info,
  lt_parameter   TYPE vscan_rfc_param_t,
  ls_engine_info TYPE vscan_rfc_engine_info,
  lt_driver_info TYPE vscan_rfc_driver_info_t,
  lf_from_buffer TYPE abap_bool.

DATA:
  gf_started          TYPE abap_bool VALUE ' ',
  gf_scanrc           TYPE vscan_scanrc,
  gt_bapiret          TYPE vscan_bapiret2_t,
  gt_scanerror        TYPE vscan_scanerror_t,
  gt_infection        TYPE vscan_infection_t.


****************************************
*
*  create configuration
*
*****************************************

INITIALIZATION.
  DATA: c_name TYPE c LENGTH 10.
  DATA: c_value TYPE c LENGTH 2048.

  c_name = 'VSA_LIB'.
  CALL 'C_GETENV' ID 'NAME'  FIELD c_name  "#EC CI_CCALL
                  ID 'VALUE' FIELD c_value.

  IF c_value IS INITIAL.
    IF sy-opsys = 'Linux'.
      vsa_lib = 'libsapcsa.so'.
    ELSEIF sy-opsys CS 'Windows'.
      vsa_lib = 'sapcsa.dll'.
    ELSE.
      vsa_lib = 'libsapcsa.so'.
    ENDIF.
  ELSE.
    vsa_lib = c_value.
  ENDIF.

  CONCATENATE 'VSA_' sy-host INTO ls_vscan_server-name.
  TRANSLATE ls_vscan_server-name TO UPPER CASE.

  SELECT SINGLE * FROM vscan_server INTO ls_vscan_server
         WHERE name = ls_vscan_server-name.

  IF sy-subrc = 0.
    DATA vname TYPE string.
    vname = ls_vscan_server-name.
    PERFORM start_customizing USING vname.
    RETURN.
  ENDIF.

START-OF-SELECTION.
  SELECT SINGLE * FROM vscan_server INTO ls_vscan_server
         WHERE name = ls_vscan_server-name.


  IF sy-subrc = 0.
    DATA vvname TYPE string.
    vname = ls_vscan_server-name.
    PERFORM start_customizing USING vname.
    EXIT.
  ENDIF.
  ls_vscan_server-type = 'ADAPTER'.
  ls_vscan_server-scangroup = 'DEFAULT'.
  ls_vscan_server-status = 'ACTV'.
  ls_vscan_server-initinterval = '0024'.
  CALL 'C_SAPGPARAM'                                      "#EC CI_CCALL
                 ID 'NAME'  FIELD 'rdisp/myname'
                 ID 'VALUE' FIELD ls_vscan_server-asname.
  ls_vscan_server-vsa_lib = vsa_lib.
  ls_vscan_group-scangroup = group.
  INSERT INTO vscan_group VALUES ls_vscan_group.
  IF sy-subrc = 0.
    bvscangroup = 'X'.
  ELSE.
    bvscangroup = ' '.
  ENDIF.

  INSERT INTO vscan_server VALUES ls_vscan_server.
  IF sy-subrc = 0.
    bvscanserver = 'X'.
  ELSE.
    bvscanserver = ' '.
  ENDIF.

****************************************
*
*  start test
*
*****************************************
  CALL METHOD cl_vscan_adapter=>start_local_adapter
    EXPORTING
      name        = ls_vscan_server-name
      vsa_lib     = ls_vscan_server-vsa_lib
    IMPORTING
      eo_adapter  = lo_vsa
      error_msg   = gf_msg_buf
      return_code = gf_rc
    EXCEPTIONS
      OTHERS      = 1.
  IF sy-subrc <> 0 OR gf_rc <> 0.
    IF gf_msg_buf IS INITIAL.
      WRITE: 'No instance available' .
    ELSE.
      WRITE: gf_msg_buf.
    ENDIF.
    IF bvscanserver = 'X'.
      DELETE vscan_server FROM ls_vscan_server.
    ENDIF.
    IF bvscangroup = 'X'.
      DELETE vscan_group FROM ls_vscan_group.
    ENDIF.
    EXIT.
  ENDIF.

  IF lo_vsa->is_alive( ) = abap_false.
    gf_started = abap_true.
    CALL METHOD lo_vsa->start_on_appserver
      EXPORTING
        if_reinit = abap_false
      EXCEPTIONS
        OTHERS    = 1.
    IF sy-subrc <> 0.
      IF bvscanserver = 'X'.
        DELETE vscan_server FROM ls_vscan_server.
      ENDIF.
      IF bvscangroup = 'X'.
        DELETE vscan_group FROM ls_vscan_group.
      ENDIF.
      CONCATENATE 'This server: ' sy-host ' cannot start the VSA. '
          'Check trace in SM50' INTO gf_msg_buf RESPECTING BLANKS.
      WRITE: gf_msg_buf .
      EXIT.
    ENDIF.
  ELSE.
    " create profile
    SELECT * FROM vscan_prof INTO TABLE lt_vscan_profs.

    DATA: bneedz TYPE c VALUE 'X',
          bact  TYPE c  VALUE ' '.
    LOOP AT lt_vscan_profs INTO ls_vscan_prof.
      IF ls_vscan_prof-active = 'X'.
        bact = 'X'.
      ENDIF.
      IF ls_vscan_prof-profile = profile.
        bneedz = ' '.
      ENDIF.
    ENDLOOP.

    ls_vscan_prof-active = 'X'.
    ls_vscan_prof-is_default = 'X'.
    ls_vscan_prof-mandt = sy-mandt.
    ls_vscan_prof-profile = profile.
    ls_vscan_prof-profile_cond = 'AND'.
    ls_vscan_prof-reference = ' '.
    ls_vscan_prof-use_ref = ' '.
    INSERT INTO vscan_prof VALUES ls_vscan_prof.
    IF sy-subrc = 0.
      bzvscanprof  = 'X'.
    ELSE.
      bzvscanprof  = ' '.
    ENDIF.

    IF bzvscanprof  = 'X'.
      LOOP AT lt_vscan_profs INTO ls_vscan_prof.
        ls_vscan_prof-active = 'X'.
        UPDATE vscan_prof FROM ls_vscan_prof.
      ENDLOOP.
    ENDIF.
    ls_vscan_step-group_order = 0.
    ls_vscan_step-mandt = sy-mandt.
    ls_vscan_step-profile = profile.
    ls_vscan_step-scangroup = group.
    ls_vscan_step-step_type = 'GROUP'.
    INSERT INTO vscan_prof_grp VALUES ls_vscan_step.

    ls_vscan_param-group_order = 0.
    ls_vscan_param-mandt = sy-mandt.
    ls_vscan_param-parameter_key = 'CUST_NOT_SCANNED_AS_WARNING'.
    ls_vscan_param-parameter_value = '1'.
    ls_vscan_param-profile = profile.
    INSERT INTO vscan_prof_par VALUES ls_vscan_param.


  ENDIF.
  CALL METHOD lo_vsa->get_engine_info
    IMPORTING
      es_engine_info = ls_engine_info
      et_driver_info = lt_driver_info.

  IF sy-subrc <> 0.
    WRITE: 'Vsa engine failed'.
    EXIT.
  ENDIF.

  CALL METHOD lo_vsa->get_vsa_info
    IMPORTING
      es_vsa_info    = ls_vsa_info
      et_parameters  = lt_parameter
      ef_from_buffer = lf_from_buffer
    EXCEPTIONS
      not_available  = 1
      OTHERS         = 2.

  IF sy-subrc <> 0.
    WRITE:  'Vsa info failed'.
    EXIT.
  ENDIF.


  DEFINE def_add_blob.
    lf_blob = &1.
    concatenate
        gf_data
        lf_blob
      into
        gf_data
      in byte mode.
  END-OF-DEFINITION.

  CLEAR gf_data.
  def_add_blob '58354F2150254041505B345C505A58353428505E'.
  def_add_blob '2937434329377D2445494341522D5354414E4441'.
  def_add_blob '52442D414E544956495255532D544553542D4649'.
  def_add_blob '4C452124482B482A'.



  CALL METHOD lo_vsa->if_vscan_instance~scan_bytes
    EXPORTING
      if_job_id           = 'EICAR.EXE'
      if_data             = gf_data
      if_do_clean         = abap_false
      if_active_content   = abap_false
      if_no_details       = abap_false
    IMPORTING
      ef_scanrc           = gf_scanrc
      ef_data             = gf_data_clean
      et_bapiret          = gt_bapiret
      et_scanerror        = gt_scanerror
      et_infection        = gt_infection
    EXCEPTIONS
      not_available       = 1
      configuration_error = 2
      internal_error      = 3
      OTHERS              = 4.
  IF sy-subrc <> 0.
    WRITE: 'Scan failed'.
  ENDIF.
  IF gf_scanrc <> -2.
    WRITE: 'EICAR test virus not found'.
  ENDIF.
*-----------------------------------------------------------------------

***********************************************************************
* START_CUSTOMIZING
* Call program RSVSCANCUST for this server
***********************************************************************
FORM start_customizing USING vname TYPE string.

*   Single maintenance
  DATA:
    ls_sellist TYPE vimsellist,
    lt_sellist TYPE STANDARD TABLE OF vimsellist.

  ls_sellist-viewfield = 'NAME'.
  ls_sellist-operator  = 'EQ'.
  ls_sellist-value     = vname.
  APPEND ls_sellist TO lt_sellist.

  CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
    EXPORTING
      action      = 'S'
      view_name   = 'VSCAN_SERVER'
    TABLES
      dba_sellist = lt_sellist
    EXCEPTIONS
      OTHERS      = 1.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            DISPLAY LIKE 'E'
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    "START_CUSTOMIZING