[Commits] r654 - in trunk/daemon: . src
new-commit at lists.openvcp.org
new-commit at lists.openvcp.org
Fri Feb 20 21:25:44 UTC 2009
Author: cryptronic
Date: 2009-02-20 21:25:43 +0000 (Fri, 20 Feb 2009)
New Revision: 654
Added:
trunk/daemon/src/userbackup.c
trunk/daemon/src/userbackup.h
Modified:
trunk/daemon/Makefile.in
trunk/daemon/openvcpd.conf
trunk/daemon/src/parseconfig.c
trunk/daemon/src/parseconfig.h
trunk/daemon/src/request.c
trunk/daemon/src/request.h
Log:
Added new feature: Backups for VServers
Need a lot more testing
Modified: trunk/daemon/Makefile.in
===================================================================
--- trunk/daemon/Makefile.in 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/Makefile.in 2009-02-20 21:25:43 UTC (rev 654)
@@ -9,7 +9,7 @@
LDFLAGS=@LDFLAGS@
LIBS=@LIBS@
-OBJECTS = src/misc.o src/node.o src/traffic.o src/logtraffic.o src/setup.o src/set.o src/parseconfig.o src/get.o src/request.o lib/fs.o lib/strings.o src/xml.o src/filter.o src/bandwidth.o src/trafficlimit.o
+OBJECTS = src/misc.o src/node.o src/traffic.o src/logtraffic.o src/setup.o src/set.o src/parseconfig.o src/get.o src/request.o lib/fs.o lib/strings.o src/xml.o src/filter.o src/bandwidth.o src/trafficlimit.o src/userbackup.o
all: openvcpd parse_ipfmlogs
openvcpd: $(OBJECTS)
@@ -30,6 +30,7 @@
lib/strings.o: lib/strings.c
src/bandwidth.o: src/bandwidth.c
src/trafficlimit.o: src/trafficlimit.c
+src/userbackup.o: src/userbackup.c
parse_ipfmlogs: src/parse_ipfmlogs.c lib/fs.o lib/strings.o
$(CC) $(LIBS) $(CFLAGS) -o parse_ipfmlogs src/parse_ipfmlogs.c lib/fs.o lib/strings.o
Modified: trunk/daemon/openvcpd.conf
===================================================================
--- trunk/daemon/openvcpd.conf 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/openvcpd.conf 2009-02-20 21:25:43 UTC (rev 654)
@@ -12,6 +12,7 @@
RootDir=ROOTDIR
ConfigDir=CONFIGDIR
BackupDir=ROOTDIR/backups
+UserBackupDir=ROOTDIR/userbackups
ImageDir=ROOTDIR/images
RunDir=RUNDIR
CacheDir=CONFIGDIR/.defaults/cachebase
Modified: trunk/daemon/src/parseconfig.c
===================================================================
--- trunk/daemon/src/parseconfig.c 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/src/parseconfig.c 2009-02-20 21:25:43 UTC (rev 654)
@@ -24,7 +24,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
-
+
#include "misc.h"
#include "parseconfig.h"
#include "strings.h"
@@ -36,7 +36,7 @@
int fd;
unsigned int directives_count;
char *line, **directives;
-
+
memset(config, 0, sizeof(struct config_st));
@@ -50,11 +50,11 @@
free(line);
continue;
}
-
+
directives = split_string(line, '=', &directives_count);
-
+
if(directives_count >= 2)
- {
+ {
if(strcasecmp(directives[0], "IP") == 0)
@@ -110,6 +110,12 @@
strcpy(config->backup_dir, directives[1]);
}
else
+ if(strcasecmp(directives[0], "UserBackupDir") == 0)
+ {
+ config->userbackup_dir = (char *) malloc(strlen(directives[1])+1);
+ strcpy(config->userbackup_dir, directives[1]);
+ }
+ else
if(strcasecmp(directives[0], "ImageDir") == 0)
{
config->image_dir = (char *) malloc(strlen(directives[1])+1);
@@ -151,9 +157,9 @@
config->adminemail = (char *) malloc(strlen(directives[1])+1);
strcpy(config->adminemail, directives[1]);
}
-
+
}
-
+
free_strings(directives, directives_count);
free(line);
}
@@ -194,7 +200,7 @@
die("ERROR: IfbDev Directive not Found\n");
if(config->adminemail == NULL)
die("ERROR: AdminEmail Directive not Found\n");
-
+
if(!dir_exist(config->root_dir))
die("ERROR: Root Directory does not exist\n");
if(!dir_exist(config->config_dir))
@@ -221,17 +227,17 @@
int fd;
unsigned int directives_count;
char *line, **directives;
-
+
memset(image, 0, sizeof(struct image_st));
sconcat(filename, BUF_SIZE, global_settings.image_dir, "/", id, ".conf", NULL);
if(!file_exist(filename))
return -1;
-
+
if((fd = open(filename, O_RDONLY)) != -1)
{
-
+
while((line = file_readline(fd)) != NULL)
{
if(line[0] == '#')
@@ -239,11 +245,11 @@
free(line);
continue;
}
-
+
directives = split_string(line, '=', &directives_count);
-
+
if(directives_count >= 2)
- {
+ {
if(strcmp(directives[0], "name") == 0)
@@ -257,10 +263,10 @@
image->initstyle = (char *) malloc(strlen(directives[1])+1);
strcpy(image->initstyle, directives[1]);
}
-
-
+
+
}
-
+
free_strings(directives, directives_count);
free(line);
}
@@ -286,7 +292,7 @@
if(image->initstyle != NULL)
free(image->initstyle);
-
+
return 0;
}
Modified: trunk/daemon/src/parseconfig.h
===================================================================
--- trunk/daemon/src/parseconfig.h 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/src/parseconfig.h 2009-02-20 21:25:43 UTC (rev 654)
@@ -30,22 +30,23 @@
char *logfile;
int loglevel;
char *startxid;
-
+
char *root_dir;
char *config_dir;
char *backup_dir;
+ char *userbackup_dir;
char *image_dir;
char *run_dir;
char *cache_dir;
char *pid_file;
-
+
char *ifaces;
char *ifbdev;
-
+
char *adminemail;
};
-
-
+
+
struct image_st
{
char *name;
@@ -54,8 +55,8 @@
int parse_config(char *filename, struct config_st *config);
-
-
+
+
int parse_image(char *id, struct image_st *image);
int free_image(struct image_st *image);
Modified: trunk/daemon/src/request.c
===================================================================
--- trunk/daemon/src/request.c 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/src/request.c 2009-02-20 21:25:43 UTC (rev 654)
@@ -34,7 +34,7 @@
#include "trafficlimit.h"
-
+
struct ovcp_method ovcp_vserver_methods[] =
{
{ "get_xid", { "int", "string", NULL }, "", get_xid },
@@ -77,6 +77,10 @@
{ "get_resources", { NULL }, "", get_resources },
{ "resources_hour", { NULL }, "", vserver_resources_hour },
{ "rescue", { NULL }, "", vserver_rescue },
+ { "get_userbackups", { NULL }, "", get_userbackups },
+ { "create_userbackups", { NULL }, "", create_userbackups },
+ { "restore_userbackups", { NULL }, "", restore_userbackups },
+ { "delete_userbackups", { NULL }, "", delete_userbackups },
{ NULL, {NULL}, NULL, NULL }
};
@@ -85,7 +89,7 @@
{
{ "version", { NULL }, "", node_version },
{ "halt", { NULL }, "", node_halt },
- { "reboot", { NULL }, "", node_reboot },
+ { "reboot", { NULL }, "", node_reboot },
{ "stat", { NULL }, "", node_stat },
{ "get_interfaces", { NULL }, "", node_get_interfaces },
{ "get_images", { NULL }, "", node_get_images },
@@ -93,16 +97,16 @@
{ "traffic_total", { NULL }, "", node_get_traffic_total },
{ "traffic_hour", { NULL }, "", node_get_traffic_hour },
{ "get_uptime", { NULL }, "", node_get_uptime },
- { "get_load", { NULL }, "", node_get_load },
- { "get_mem", { NULL }, "", node_get_memory },
- { "get_space", { NULL }, "", node_get_space },
+ { "get_load", { NULL }, "", node_get_load },
+ { "get_mem", { NULL }, "", node_get_memory },
+ { "get_space", { NULL }, "", node_get_space },
{ "guest_list", { NULL }, "", vserver_list },
{ NULL, {NULL}, NULL, NULL }
};
struct ovcp_method ovcp_setup_methods[] =
-{
+{
{ "vserver_config", { NULL }, "", vserver_setup_config },
{ "vserver_image", { NULL }, "", vserver_setup_image },
{ NULL, {NULL}, NULL, NULL }
@@ -110,7 +114,7 @@
struct ovcp_method ovcp_system_methods[] =
-{
+{
{ "listMethods", { "array", NULL } , "Enumerate the methods implemented by the server", system_list_methods},
{ "methodSignature", { "array", "string", NULL }, "This method takes one parameter, the name of a method implemented by the server.\n\nIt returns the signature for the method. A signature is an array of types. The first of these types is the return type of the method, the rest are parameters.\n\nA signature is restricted to the top level parameters expected by a method. For instance if a method expects one array of structs as a parameter, and it returns a string, its signature is simply \"string, array\". If it expects three integers, its signature is \"string, int, int, int\".\n\nIf no signature is defined for the method, a none-array value is returned.", system_method_signature },
{ "methodHelp",{ "string", "string", NULL }, "This method takes one parameter, the name of a method implemented by the server.\n\nIt returns a documentation string describing the use of that method. If no such string is available, an empty string is returned.\n\nThe documentation string may contain HTML markup.", system_method_help },
@@ -129,23 +133,23 @@
ovcp_response_array_new(response);
i = 0;
-
+
while(modules[i].name != NULL)
{
j=0;
while(modules[i].methods[j].name != NULL)
- {
+ {
sconcat(buf, BUF_SIZE,modules[i].name, ".", modules[i].methods[j].name, NULL);
ovcp_response_array_add_string(response, buf);
j++;
}
i++;
- }
+ }
ovcp_response_array_end(response);
-
+
return response;
}
@@ -158,30 +162,30 @@
arg0 = ovcp_request_get_arg(request, 0);
method_string = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || method == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
response = NULL;
-
+
module = strtok(method_string, ".");
method = strtok(NULL, ".");
-
+
i = 0;
-
+
while(modules[i].name != NULL)
{
if(strcmp(modules[i].name, module) == 0)
{
j = 0;
-
+
while(modules[i].methods[j].name != NULL)
{
if(strcmp(modules[i].methods[j].name, method) == 0)
{
if(modules[i].methods[j].signature[0] != NULL)
{
- response = ovcp_response_new();
+ response = ovcp_response_new();
ovcp_response_array_new(response);
k = 0;
@@ -196,12 +200,12 @@
break;
}
j++;
- }
+ }
break;
- }
+ }
i++;
}
-
+
if(response == NULL)
{
response = ovcp_response_new();
@@ -220,38 +224,38 @@
arg0 = ovcp_request_get_arg(request, 0);
method_string = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || method == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
response = NULL;
-
+
module = strtok(method_string, ".");
method = strtok(NULL, ".");
-
+
i = 0;
-
+
while(modules[i].name != NULL)
{
if(strcmp(modules[i].name, module) == 0)
{
j = 0;
-
+
while(modules[i].methods[j].name != NULL)
{
if(strcmp(modules[i].methods[j].name, method) == 0)
{
- response = ovcp_response_new();
+ response = ovcp_response_new();
ovcp_response_add_string(response, modules[i].methods[j].help);
break;
}
j++;
- }
+ }
break;
- }
+ }
i++;
}
-
+
if(response == NULL)
{
response = ovcp_response_new();
@@ -266,7 +270,7 @@
struct ovcp_response_st *response;
response = ovcp_response_new();
ovcp_response_add_string(response, OVCP_XML_RPC_API_VERSION);
-
+
return response;
}
@@ -278,10 +282,10 @@
char destpath[BUF_SIZE];
char *name; int ret;
char *runfile;
-
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
@@ -293,57 +297,57 @@
return ovcp_response_error(OVCP_ERROR_NOTSTOPPED, OVCP_ERROR_NOTSTOPPED_DESC);
free(runfile);
-
+
if(!vserver_lock(name))
return ovcp_response_error(OVCP_ERROR_VSLOCKED, OVCP_ERROR_VSLOCKED_DESC);
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s/rescue", global_settings.config_dir, name);
-
-
+
+
if(!file_exist(srcpath))
{
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.image_dir, "rescue");
ret = readlink(srcpath, destpath, BUF_SIZE);
-
+
if(ret <= 0) return ovcp_response_error(OVCP_ERROR_NORESCUEIMG, OVCP_ERROR_NORESCUEIMG_DESC);
-
-
+
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.root_dir, name);
snprintf(destpath, BUF_SIZE, "%s/%s", global_settings.backup_dir, name);
-
+
if(execb_cmd("mv", "mv", srcpath, destpath, NULL) != 0)
return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
-
+
if(!dir_exist(destpath))
return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.image_dir, "rescue");
ret = readlink(srcpath, destpath, BUF_SIZE);
-
+
destpath[ret] = 0;
trim_slashes(destpath);
-
+
if(strncmp(destpath, global_settings.image_dir, strlen(global_settings.image_dir)) == 0)
ret = setup_image(name, destpath+strlen(global_settings.image_dir)+1);
else
ret = setup_image(name, destpath);
-
+
if(!ret) return ovcp_response_error(OVCP_ERROR_UABLCPYIMG, OVCP_ERROR_UABLCPYIMG_DESC);
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.backup_dir, name);
snprintf(destpath, BUF_SIZE, "%s/%s/vserver", global_settings.root_dir, name);
if(execb_cmd("mv", "mv", srcpath, destpath, NULL) != 0)
return ovcp_response_error(OVCP_ERROR_UABLRESTORE, OVCP_ERROR_UABLRESTORE_DESC);
-
-
+
+
snprintf(srcpath, BUF_SIZE, "%s/%s/rescue", global_settings.config_dir, name);
- file_touch(srcpath);
-
+ file_touch(srcpath);
+
response = ovcp_response_new();
ovcp_response_add_string(response, "On");
}
@@ -351,35 +355,35 @@
{
snprintf(srcpath, BUF_SIZE, "%s/%s/vserver", global_settings.root_dir, name);
snprintf(destpath, BUF_SIZE, "%s/%s", global_settings.backup_dir, name);
-
+
if(execb_cmd("mv", "mv", srcpath, destpath, NULL) != 0)
return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
-
+
if(!dir_exist(destpath))
return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.root_dir, name);
if(execb_cmd("rm", "rm", "-rf", srcpath, NULL) != 0)
- return ovcp_response_error(OVCP_ERROR_UABLDELETE, OVCP_ERROR_UABLDELETE_DESC);
+ return ovcp_response_error(OVCP_ERROR_UABLDELETE, OVCP_ERROR_UABLDELETE_DESC);
-
+
snprintf(srcpath, BUF_SIZE, "%s/%s", global_settings.backup_dir, name);
snprintf(destpath, BUF_SIZE, "%s/%s", global_settings.root_dir, name);
if(execb_cmd("mv", "mv", srcpath, destpath, NULL) != 0)
return ovcp_response_error(OVCP_ERROR_UABLRESTORE, OVCP_ERROR_UABLRESTORE_DESC);
-
-
+
+
snprintf(srcpath, BUF_SIZE, "%s/%s/rescue", global_settings.config_dir, name);
unlink(srcpath);
-
+
response = ovcp_response_new();
ovcp_response_add_string(response, "Off");
}
-
-
+
+
vserver_unlock(name);
-
+
return response;
}
@@ -394,19 +398,19 @@
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
-
+
+
if(!vserver_lock(name))
return ovcp_response_error(OVCP_ERROR_VSLOCKED, OVCP_ERROR_VSLOCKED_DESC);
-
+
response = ovcp_response_new();
-
+
output = exec_cmd("vserver", 900, "vserver", name, "start", NULL);
trim_string(output);
@@ -415,27 +419,27 @@
vserver_unlock(name);
free(output);
-
-
+
+
sconcat(path, BUF_SIZE, global_settings.root_dir, "/", name, "/image-post.sh", NULL);
-
+
if(file_exist(path))
{
output = exec_cmd("vserver", 900, "vserver", name, "exec", "/image-post.sh", NULL);
-
+
if(output != NULL)
{
- trim_string(output);
+ trim_string(output);
ovcp_response_add_string(response, output);
free(output);
}
-
+
remove(path);
}
-
-
-
+
+
+
return response;
}
@@ -447,28 +451,28 @@
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
-
+
+
if(!vserver_lock(name))
return ovcp_response_error(OVCP_ERROR_VSLOCKED, OVCP_ERROR_VSLOCKED_DESC);
-
+
response = ovcp_response_new();
-
+
output = exec_cmd("vserver", 900, "vserver", name, "stop", NULL);
-
+
trim_string(output);
ovcp_response_add_string(response, output);
vserver_unlock(name);
free(output);
-
+
return response;
}
@@ -484,17 +488,17 @@
char path[BUF_SIZE];
response = ovcp_response_new();
-
-
+
+
ovcp_response_array_new(response);
if((dir_ptr = opendir(global_settings.config_dir)) != NULL)
{
-
+
while((dir_entry = readdir(dir_ptr)) != NULL)
{
-
+
if(dir_entry->d_name[0] != '.')
{
sconcat(path, BUF_SIZE, global_settings.config_dir, "/", dir_entry->d_name, NULL);
@@ -502,7 +506,7 @@
if(dir_exist(path))
ovcp_response_array_add_string(response, dir_entry->d_name);
}
-
+
}
@@ -510,7 +514,7 @@
}
ovcp_response_array_end(response);
-
+
return response;
}
@@ -520,47 +524,47 @@
struct ovcp_data_st *arg0, *arg1, *arg2, *arg3;
int i, ret, *month, *year, *day, nrow, ncolumn;
char *name;
-
- char *sql_error;
+
+ char *sql_error;
char sql_query[BUF_SIZE];
char **sql_result;
-
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
- return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
+ return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
arg1 = ovcp_request_get_arg(request, 1);
month = (int *)ovcp_data_get(arg1);
-
+
if(!ovcp_data_is_int(arg1) || month == NULL)
- return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
+ return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
arg2 = ovcp_request_get_arg(request, 2);
year = (int *)ovcp_data_get(arg2);
-
+
if(!ovcp_data_is_int(arg2) || year == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
arg3 = ovcp_request_get_arg(request, 3);
day = (int *)ovcp_data_get(arg3);
-
+
if(!ovcp_data_is_int(arg3) || day == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
-
-
- snprintf(sql_query, BUF_SIZE,
+
+
+
+ snprintf(sql_query, BUF_SIZE,
"SELECT * FROM vserver_hour_resources WHERE (name='%s' and month=%d and day=%d and year=%d)", name, *month, *day, *year);
ovcp_log(OVCP_DEBUG, "SQL Traffic Query: [%s]", sql_query);
-
+
ret = sqlite3_get_table(ovcp_db, sql_query, &sql_result, &nrow, &ncolumn, &sql_error);
if(ret != SQLITE_OK)
@@ -576,8 +580,8 @@
while(i != nrow+1)
{
ovcp_response_struct_new(response);
-
-
+
+
ovcp_response_struct_add_string(response, "month", sql_result[i*(ncolumn)+0]);
ovcp_response_struct_add_string(response, "hour", sql_result[i*(ncolumn)+1]);
ovcp_response_struct_add_string(response, "day", sql_result[i*(ncolumn)+2]);
@@ -593,19 +597,19 @@
ovcp_response_struct_add_string(response, "sock", sql_result[i*(ncolumn)+13]);
ovcp_response_struct_add_string(response, "msgq", sql_result[i*(ncolumn)+14]);
ovcp_response_struct_add_string(response, "shm", sql_result[i*(ncolumn)+15]);
-
-
+
+
ovcp_response_struct_end(response);
- i++;
+ i++;
}
sqlite3_free_table(sql_result);
-
+
return response;
}
@@ -615,57 +619,57 @@
{
struct ovcp_response_st *response;
struct ovcp_data_st *arg0, *arg1, *arg2, *arg3;
-
- char *sql_error;
+
+ char *sql_error;
char sql_query[BUF_SIZE+1];
char *name;
int ret;
int i = 0;
-
+
int nrow, ncolumn;
char **sql_result;
int *month, *year, *day;
-
+
char *ddn_ip;
ovcp_ip ipdec;
-
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
- return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
+ return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
+
arg1 = ovcp_request_get_arg(request, 1);
month = (int *)ovcp_data_get(arg1);
-
+
if(!ovcp_data_is_int(arg1) || month == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
arg2 = ovcp_request_get_arg(request, 2);
year = (int *)ovcp_data_get(arg2);
-
+
if(!ovcp_data_is_int(arg2) || year == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
arg3 = ovcp_request_get_arg(request, 3);
day = (int *)ovcp_data_get(arg3);
-
+
if(!ovcp_data_is_int(arg3) || day == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
-
-
-
- snprintf(sql_query, BUF_SIZE,
+
+
+
+
+ snprintf(sql_query, BUF_SIZE,
"SELECT * FROM vserver_hour_traffic WHERE (month=%d and day=%d and year=%d and name='%s')", *month, *day, *year, name);
ovcp_log(OVCP_DEBUG, "SQL Traffic Query: [%s]", sql_query);
-
-
+
+
ret = sqlite3_get_table(ovcp_db, sql_query, &sql_result, &nrow, &ncolumn, &sql_error);
if(ret != SQLITE_OK)
@@ -681,8 +685,8 @@
while(i != nrow+1)
{
ovcp_response_struct_new(response);
-
-
+
+
#ifdef IPV6_SUPPORT
if(strstr(sql_result[i*(ncolumn)+4], ":") != NULL)
{
@@ -697,7 +701,7 @@
sscanf(sql_result[i*(ncolumn)+4], "%u", &ipdec);
ddn_ip = ip2str(ipdec);
#endif
-
+
ovcp_response_struct_add_string(response, "month", sql_result[i*(ncolumn)+0]);
ovcp_response_struct_add_string(response, "hour", sql_result[i*(ncolumn)+1]);
ovcp_response_struct_add_string(response, "day", sql_result[i*(ncolumn)+2]);
@@ -706,22 +710,22 @@
ovcp_response_struct_add_string(response, "in", sql_result[i*(ncolumn)+5]);
ovcp_response_struct_add_string(response, "out", sql_result[i*(ncolumn)+6]);
ovcp_response_struct_add_string(response, "total", sql_result[i*(ncolumn)+7]);
-
+
free(ddn_ip);
-
+
ovcp_response_struct_end(response);
- i++;
+ i++;
}
sqlite3_free_table(sql_result);
-
+
return response;
}
@@ -733,51 +737,51 @@
char *ddn_ip;
struct ovcp_response_st *response;
struct ovcp_data_st *arg0, *arg1, *arg2;
-
- char *sql_error;
+
+ char *sql_error;
char sql_query[BUF_SIZE+1];
char *name;
int ret;
int i = 0;
-
+
int nrow, ncolumn;
char **sql_result;
int *month, *year;
-
+
ovcp_ip ipdec;
-
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
- return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
+ return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
+
arg1 = ovcp_request_get_arg(request, 1);
month = (int *)ovcp_data_get(arg1);
-
+
if(!ovcp_data_is_int(arg1) || month == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
arg2 = ovcp_request_get_arg(request, 2);
year = (int *)ovcp_data_get(arg2);
-
+
if(!ovcp_data_is_int(arg2) || year == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
-
-
-
-
- snprintf(sql_query, BUF_SIZE,
+
+
+
+
+
+ snprintf(sql_query, BUF_SIZE,
"SELECT * FROM vserver_traffic WHERE (month=%d and year=%d and name='%s')", *month, *year, name);
ovcp_log(OVCP_DEBUG, "SQL Traffic Query: [%s]", sql_query);
-
+
ret = sqlite3_get_table(ovcp_db, sql_query, &sql_result, &nrow, &ncolumn, &sql_error);
if(ret != SQLITE_OK)
@@ -793,8 +797,8 @@
while(i != nrow+1)
{
ovcp_response_struct_new(response);
-
+
#ifdef IPV6_SUPPORT
if(strstr(sql_result[i*(ncolumn)+3], ":") != NULL)
{
@@ -809,7 +813,7 @@
sscanf(sql_result[i*(ncolumn)+3], "%u", &ipdec);
ddn_ip = ip2str(ipdec);
#endif
-
+
ovcp_response_struct_add_string(response, "month", sql_result[i*(ncolumn)+0]);
ovcp_response_struct_add_string(response, "day", sql_result[i*(ncolumn)+1]);
ovcp_response_struct_add_string(response, "year", sql_result[i*(ncolumn)+2]);
@@ -818,21 +822,21 @@
ovcp_response_struct_add_string(response, "out", sql_result[i*(ncolumn)+5]);
ovcp_response_struct_add_string(response, "total", sql_result[i*(ncolumn)+6]);
-
+
free(ddn_ip);
-
+
ovcp_response_struct_end(response);
- i++;
+ i++;
}
sqlite3_free_table(sql_result);
-
+
return response;
}
@@ -844,51 +848,51 @@
struct ovcp_response_st *response;
struct ovcp_data_st *arg0, *arg1, *arg2;
-
- char *sql_error;
+
+ char *sql_error;
char sql_query[BUF_SIZE+1];
char *name;
int ret;
int i = 0;
-
+
int nrow, ncolumn;
char **sql_result;
-
+
double day_traffic_in, day_traffic_out, day_traffic_total;
double month_traffic_in = 0, month_traffic_out = 0, month_traffic_total = 0;
int *month, *year;
-
-
+
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
- return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
+ return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
+
arg1 = ovcp_request_get_arg(request, 1);
month = (int *)ovcp_data_get(arg1);
-
+
if(!ovcp_data_is_int(arg1) || month == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
arg2 = ovcp_request_get_arg(request, 2);
year = (int *)ovcp_data_get(arg2);
-
+
if(!ovcp_data_is_int(arg2) || year == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
-
-
- snprintf(sql_query, BUF_SIZE,
+
+
+
+ snprintf(sql_query, BUF_SIZE,
"SELECT \"in\",\"out\",\"total\" FROM vserver_traffic WHERE (month=%d and year=%d and name='%s')", *month, *year, name);
ovcp_log(OVCP_DEBUG, "SQL Traffic Query: [%s]", sql_query);
-
-
+
+
ret = sqlite3_get_table(ovcp_db, sql_query, &sql_result, &nrow, &ncolumn, &sql_error);
if(ret != SQLITE_OK)
@@ -899,11 +903,11 @@
}
i = 1;
-
+
while(i != nrow+1)
{
-
-
+
+
day_traffic_in = strtod(sql_result[i*(ncolumn)], NULL);
day_traffic_out = strtod(sql_result[i*(ncolumn)+1], NULL);
day_traffic_total = strtod(sql_result[i*(ncolumn)+2], NULL);
@@ -912,25 +916,25 @@
month_traffic_in += day_traffic_in;
month_traffic_out += day_traffic_out;
month_traffic_total += day_traffic_total;
-
- i++;
+
+ i++;
}
-
+
sqlite3_free_table(sql_result);
-
+
response = ovcp_response_new();
-
+
ovcp_response_struct_new(response);
-
+
ovcp_response_struct_add_double(response, "in", month_traffic_in);
ovcp_response_struct_add_double(response, "out", month_traffic_out);
ovcp_response_struct_add_double(response, "total", month_traffic_total);
-
+
ovcp_response_struct_end(response);
-
+
return response;
}
@@ -940,18 +944,18 @@
struct ovcp_data_st *arg0;
char *name;
-
+
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
if(setup_config(name) != 1)
return ovcp_response_error(OVCP_ERROR_UABLCRTCONF, OVCP_ERROR_UABLCRTCONF_DESC);
response = ovcp_response_new();
-
+
ovcp_response_add_boolean(response, TRUE);
return response;
@@ -967,23 +971,23 @@
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
if(!vserver_exist(name))
return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
+
if(!vserver_lock(name))
return ovcp_response_error(OVCP_ERROR_VSLOCKED, OVCP_ERROR_VSLOCKED_DESC);
arg1 = ovcp_request_get_arg(request, 1);
image = (char *)ovcp_data_get(arg1);
-
+
if(!ovcp_data_is_string(arg1) || image == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
if(setup_image(name, image) != 1)
return ovcp_response_error(OVCP_ERROR_UABLCPYIMG, OVCP_ERROR_UABLCPYIMG_DESC);
@@ -998,15 +1002,15 @@
- response = ovcp_response_new();
+ response = ovcp_response_new();
sconcat(path1, BUF_SIZE, global_settings.image_dir, "/", image, "-pre.sh", NULL);
-
+
if(file_exist(path1))
{
output = exec_cmd("sh", 900, "sh", path1, name, NULL);
-
+
if(output != NULL)
{
ovcp_response_add_string(response, output);
@@ -1019,16 +1023,16 @@
}
else
{
- ovcp_response_add_boolean(response, TRUE);
- }
-
-
+ ovcp_response_add_boolean(response, TRUE);
+ }
-
+
+
+
vserver_unlock(name);
-
+
return response;
}
@@ -1040,14 +1044,14 @@
arg0 = ovcp_request_get_arg(request, 0);
name = (char *)ovcp_data_get(arg0);
-
+
if(!ovcp_data_is_string(arg0) || name == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
-
+
if(!vserver_exist(name))
return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
-
-
+
+
path = concat(global_settings.config_dir, "/", name, NULL);
if(dir_exist(path))
@@ -1055,19 +1059,19 @@
output = exec_cmd("rm", 10, "rm", "-rf", path, NULL);
free(output);
}
-
+
free(path);
path = concat(global_settings.root_dir, "/", name, NULL);
-
+
if(dir_exist(path))
{
output = exec_cmd("rm", 180, "rm", "-rf", path, NULL);
free(output);
}
- free(path);
-
- response = ovcp_response_new();
+ free(path);
+
+ response = ovcp_response_new();
ovcp_response_add_boolean(response, TRUE);
Modified: trunk/daemon/src/request.h
===================================================================
--- trunk/daemon/src/request.h 2009-02-20 14:55:29 UTC (rev 653)
+++ trunk/daemon/src/request.h 2009-02-20 21:25:43 UTC (rev 654)
@@ -15,11 +15,11 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
+
#ifndef REQUEST_H
#define REQUEST_H
@@ -30,6 +30,7 @@
#include "setup.h"
#include "xml.h"
#include "bandwidth.h"
+ #include "userbackup.h"
#define OVCP_XML_RPC_API_VERSION "1.0"
Added: trunk/daemon/src/userbackup.c
===================================================================
--- trunk/daemon/src/userbackup.c (rev 0)
+++ trunk/daemon/src/userbackup.c 2009-02-20 21:25:43 UTC (rev 654)
@@ -0,0 +1,239 @@
+/* OpenVCP
+ * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <time.h>
+
+
+#include "strings.h"
+#include "misc.h"
+#include "main.h"
+#include "request.h"
+#include "error.h"
+#include "logtraffic.h"
+#include "fs.h"
+#include "userbackup.h"
+
+struct ovcp_response_st *get_userbackups(struct ovcp_request_st *request)
+{
+ struct ovcp_data_st *arg0;
+ struct ovcp_response_st *response;
+
+ char *name;
+
+ arg0 = ovcp_request_get_arg(request, 0);
+ name = (char *)ovcp_data_get(arg0);
+
+ DIR *dir_ptr;
+ struct dirent *dir_entry;
+
+ if(!ovcp_data_is_string(arg0) || name == NULL)
+ return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
+ if(!vserver_exist(name))
+ return ovcp_response_error(OVCP_ERROR_VSNOTEXIST, OVCP_ERROR_VSNOTEXIST_DESC);
+
+ response = ovcp_response_new();
+
+
+ if((dir_ptr = opendir(global_settings.userbackup_dir)) != NULL)
+ {
+
+ while((dir_entry = readdir(dir_ptr)) != NULL)
+ {
+
+ if(dir_entry->d_name[0] != '.')
+ {
+
+ if(strspn(dir_entry->d_name, name) == strlen(name))
+ ovcp_response_add_string(response, dir_entry->d_name);
+
+ }
+
+ }
+
+
+ closedir(dir_ptr);
+ }
+
+ return response;
+
+}
+struct ovcp_response_st *create_userbackups(struct ovcp_request_st *request)
+{
+ struct ovcp_data_st *arg0;
+ struct ovcp_response_st *response;
+
+ char *name, *homedir, *userbackupdir, *backupname;
+ char *min, *hour, *day, *month, *year;
+
+ struct tm *currentdate;
+ time_t timestamp = time(0);
+ currentdate = localtime(×tamp);
+
+ min = (char *)malloc(4);
+ if(currentdate->tm_min < 10) {
+ snprintf(min, 3, "0%i", currentdate->tm_min);
+ }
+ else {
+ snprintf(min, 3, "%i", currentdate->tm_min);
+ }
+ hour = (char *)malloc(4);
+ if(currentdate->tm_hour < 10) {
+ snprintf(hour, 3, "0%i", currentdate->tm_hour);
+ }
+ else {
+ snprintf(hour, 3, "%i", currentdate->tm_hour);
+ }
+ day = (char *)malloc(4);
+ if(currentdate->tm_mday < 10) {
+ snprintf(day, 3, "0%i", currentdate->tm_mday);
+ }
+ else {
+ snprintf(day, 3, "%i", currentdate->tm_mday);
+ }
+ month = (char *)malloc(4);
+ if(currentdate->tm_mon < 10) {
+ snprintf(month, 3, "0%i", currentdate->tm_mon+1);
+ }
+ else {
+ snprintf(month, 3, "%i", currentdate->tm_mon+1);
+ }
+ year = (char *)malloc(6);
+ snprintf(year, 5, "%i", currentdate->tm_year+1900);
+
+ arg0 = ovcp_request_get_arg(request, 0);
+ name = (char *)ovcp_data_get(arg0);
+
+ backupname = concat(name, "_", year, ".", month, ".", day, "_", hour, ":", min, NULL);
+ userbackupdir = concat(global_settings.userbackup_dir, "/", backupname, NULL);
+ homedir = concat(global_settings.root_dir, "/", name, NULL);
+
+ execb_cmd("cp", "cp", "-a", homedir, userbackupdir, NULL);
+
+ response = ovcp_response_new();
+
+ if(dir_exist(userbackupdir))
+ {
+ ovcp_response_add_string(response, backupname);
+ }
+ else
+ {
+ return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
+ }
+
+ free(min);
+ free(hour);
+ free(day);
+ free(month);
+ free(year);
+ free(backupname);
+ free(userbackupdir);
+ free(homedir);
+
+ return response;
+}
+
+struct ovcp_response_st *restore_userbackups(struct ovcp_request_st *request)
+{
+ struct ovcp_data_st *arg0, *arg1;
+ struct ovcp_response_st *response;
+
+ char *name, *homedir, *backupdir, *userbackupdir, *backupname;
+
+ arg0 = ovcp_request_get_arg(request, 0);
+ name = (char *)ovcp_data_get(arg0);
+
+ arg1 = ovcp_request_get_arg(request, 1);
+ backupname = (char *)ovcp_data_get(arg1);
+
+ userbackupdir = concat(global_settings.userbackup_dir, "/", backupname, NULL);
+ homedir = concat(global_settings.root_dir, "/", name, NULL);
+ backupdir = concat(global_settings.backup_dir, "/_", name, NULL);
+
+ response = ovcp_response_new();
+
+ if(dir_exist(homedir) && dir_exist(userbackupdir))
+ {
+
+ if(dir_exist(global_settings.backup_dir))
+ {
+ execb_cmd("mv", "mv", homedir, backupdir, NULL);
+
+ if(!dir_exist(backupdir))
+ return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
+ }
+
+ execb_cmd("rm", "rm", "-rf", homedir, NULL);
+
+ if(dir_exist(homedir))
+ return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
+
+ execb_cmd("cp", "cp", "-a", userbackupdir, homedir, NULL);
+
+ if(!dir_exist(homedir))
+ {
+ execb_cmd("mv", "mv", backupdir, homedir, NULL);
+ execb_cmd("rm", "rm", "-rf", backupdir, NULL);
+ return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
+ }
+ else
+ {
+ ovcp_response_add_string(response, "Success");
+ }
+ }
+ execb_cmd("rm", "rm", "-rf", backupdir, NULL);
+ free(backupdir);
+ free(backupname);
+ free(userbackupdir);
+ free(homedir);
+ return response;
+
+}
+
+struct ovcp_response_st *delete_userbackups(struct ovcp_request_st *request)
+{
+ struct ovcp_data_st *arg0;
+ struct ovcp_response_st *response;
+
+ char *userbackupdir, *backupname;
+
+ arg0 = ovcp_request_get_arg(request, 0);
+ backupname = (char *)ovcp_data_get(arg0);
+
+ userbackupdir = concat(global_settings.userbackup_dir, "/", backupname, NULL);
+
+ response = ovcp_response_new();
+
+ if(dir_exist(userbackupdir))
+ {
+
+ execb_cmd("rm", "rm", "-rf", userbackupdir, NULL);
+
+ if(dir_exist(userbackupdir))
+ return ovcp_response_error(OVCP_ERROR_BACKUPFAIL, OVCP_ERROR_BACKUPFAIL_DESC);
+
+ ovcp_response_add_string(response, "Success");
+ }
+ free(backupname);
+ free(userbackupdir);
+ return response;
+}
Added: trunk/daemon/src/userbackup.h
===================================================================
--- trunk/daemon/src/userbackup.h (rev 0)
+++ trunk/daemon/src/userbackup.h 2009-02-20 21:25:43 UTC (rev 654)
@@ -0,0 +1,29 @@
+/* OpenVCP
+ * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+
+#ifndef USERBACKUP_H
+ #define USERBACKUP_H
+
+ struct ovcp_response_st *get_userbackups(struct ovcp_request_st *request);
+ struct ovcp_response_st *create_userbackups(struct ovcp_request_st *request);
+ struct ovcp_response_st *restore_userbackups(struct ovcp_request_st *request);
+ struct ovcp_response_st *delete_userbackups(struct ovcp_request_st *request);
+
+#endif
More information about the Commits
mailing list