source: trunk/src/sh_dbCreate.c @ 481

Last change on this file since 481 was 481, checked in by katerina, 6 years ago

Enhancements and fixes for tickets #374, #375, #376, #377, #378, and #379.

File size: 5.3 KB
RevLine 
[481]1/* SAMHAIN file system integrity testing                                   */
2/* Copyright (C) 2015 Rainer Wichmann                                      */
3/*                                                                         */
4/*  This program is free software; you can redistribute it                 */
5/*  and/or modify                                                          */
6/*  it under the terms of the GNU General Public License as                */
7/*  published by                                                           */
8/*  the Free Software Foundation; either version 2 of the License, or      */
9/*  (at your option) any later version.                                    */
10/*                                                                         */
11/*  This program is distributed in the hope that it will be useful,        */
12/*  but WITHOUT ANY WARRANTY; without even the implied warranty of         */
13/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          */
14/*  GNU General Public License for more details.                           */
15/*                                                                         */
16/*  You should have received a copy of the GNU General Public License      */
17/*  along with this program; if not, write to the Free Software            */
18/*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              */
19
20#include "config_xor.h"
21
22#include <stdio.h>
23#include <string.h>
24#include <ctype.h>
25
26#include "samhain.h"
27#include "sh_utils.h"
28#include "sh_hash.h"
29#include "sh_files.h"
30
31#include "sh_dbIO.h"
32#include "sh_dbIO_int.h"
33#include "sh_pthread.h"
34#include "sh_guid.h"
35
36#undef  FIL__
37#define FIL__  _("sh_dbCreate.c")
38
39#if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE)
40
41static int dbCreate_writeout()
42{
43  char   uuid[SH_UUID_BUF];
44  char * path;
45  int    retval;
46
47  if (sh.outpath == NULL || sh.outpath[0] == '\0')
48    {
49      sh_uuid_generate_random(uuid, sizeof(uuid));
50      path = sh_util_strconcat(_("file."), sh.host.name, ".", uuid, NULL);
51    }
52  else
53    path = sh_util_strdup(sh.outpath);
54
55  retval = sh_dbIO_writeout_to_path(path);
56  SH_FREE(path);
57  return retval;
58}
59
60static void  dbCreate_run_filecheck(unsigned long add_mask, char * str)
61{
62  int status;
63
64  int reported = 0;
65  unsigned long check_flags = (MASK_READONLY_ | MODI_INIT | add_mask);
66  char * dir_name   = sh_util_dirname(str);
67  char * file_name  = sh_util_basename(str);
68
69  status = sh_files_filecheck (SH_LEVEL_READONLY, check_flags,
70                               dir_name, file_name, &reported, 0);
71
72  if (status == SH_FILE_UNKNOWN)
73    {
74      sh_hash_insert_null(str);
75    }
76
77  return;
78}
79
80static int dbCreate_filecheck(char * str)
81{
82  unsigned long add_mask = 0;
83
84  if (*str == '+')
85    {
86      add_mask = MODI_TXT;
87      ++str; while (isspace((int)*str)) ++str;
88    }
89  if (*str != '/')
90    {
91      char * tmp  = sh_util_safe_name (str);
92      sh_error_handle((-1), FIL__, __LINE__, EINVAL, MSG_E_SUBGPATH,
93                      _("Not an absolute path"), 
94                      _("dbCreate_filecheck"), tmp);
95      SH_FREE(tmp);
96      return -1;
97    }
98  dbCreate_run_filecheck(add_mask, str);
99  return 0;
100}
101
102char * rtrim(char * str)
103{
104  size_t len;
105
106  if (!str)
107    return str;
108
109  len = strlen(str);
110  while (len > 0)
111    {
112      --len;
113      if (str[len] == '\n' || str[len] == '\r')
114        str[len] = '\0';
115      else
116        break;
117    }
118   
119  return str;
120}
121
122static int dbCreate_loop(FILE * fd)
123{
124  int  status, retval = 0;
125  size_t linesize = MAX_PATH_STORE+2;
126  char * line = SH_ALLOC(linesize);
127
128  do {
129    status = sh_dbIO_getline(fd, line, linesize);
130
131    if (status > 0)
132      {
133        char * str = rtrim(line);   
134        while (isspace((int)*str)) ++str;
135        if (*str != '#')
136          {
137            int    fstatus = -1;
138            size_t len     = 0;
139            char * p       = sh_files_parse_input(str, &len);
140
141            if (p)
142              {
143                fstatus = dbCreate_filecheck(p);
144                SH_FREE(p);
145              }
146            if (fstatus != 0)
147              retval = -1;
148          }
149      }
150  } while (status != -1);
151
152  SH_FREE(line);
153  return retval;
154}
155
156static FILE * dbCreate_open (const char * path)
157{
158  FILE * fd = fopen(path, "r");
159  if (!fd)
160    {
161      int error = errno;
162      char * tmp  = sh_util_safe_name (path);
163      sh_error_handle((-1), FIL__, __LINE__, error, MSG_E_SUBGPATH,
164                      _("Cannot open file for read"), 
165                      _("dbCreate_open"), tmp);
166      SH_FREE(tmp);
167      aud_exit (FIL__, __LINE__, EXIT_FAILURE);
168    }
169  return fd;
170}
171
172static void dbCreate_setup()
173{
174  sh_hash_set_initialized();
175  sh.flag.isdaemon = S_FALSE; 
176  sh.flag.loop     = S_FALSE;
177  sh.flag.update   = S_FALSE;
178  sh.flag.checkSum = SH_CHECK_CHECK;
179 
180  sh.statistics.files_report  = 0;
181  ShDFLevel[SH_ERR_T_FILE]    = SH_ERR_SEVERE;
182  ShDFLevel[SH_ERR_T_RO]      = SH_ERR_SEVERE;
183  ShDFLevel[SH_ERR_T_NAME]    = SH_ERR_SEVERE;
184
185  sh_error_only_stderr (S_TRUE);
186  sh_error_setprint(_("none"));
187
188  return;
189}
190
191
192int sh_dbCreate (const char * path)
193{
194  FILE * fd;
195
196  /* Initialize application status
197   */
198  dbCreate_setup();
199
200  /* Open file list
201   */
202  fd = dbCreate_open(path);
203
204  /* Load the database
205   */
206  sh_hash_init_and_checksum();
207
208  /* Loop over file list to check files.
209   */
210  dbCreate_loop(fd);
211
212  /* Close file list
213   */
214  fclose(fd);
215
216  /* Write out database
217   */
218  if (0 != dbCreate_writeout())
219    aud_exit(FIL__, __LINE__, EXIT_FAILURE);
220
221  /* Exit on success.
222   */
223  aud_exit(FIL__, __LINE__, EXIT_SUCCESS);
224  return 0;
225}
226   
227#endif
Note: See TracBrowser for help on using the repository browser.