1 |
#include "jsoc_main.h" |
2 |
#include "drms.h" |
3 |
#include "drms_names.h" |
4 |
|
5 |
#define NOTSPECIFIED "***NOTSPECIFIED***" |
6 |
#define DIE(msg) {fprintf(stderr,"$$$$ %s: %s\n", module_name, msg); return 1;} |
7 |
|
8 |
ModuleArgs_t module_args[] = { |
9 |
{ARG_STRING, "ds", "lm_jps.pfss", "output data series"}, |
10 |
{ARG_STRING, "ser_beg", NOTSPECIFIED, "serial number to begin"}, |
11 |
{ARG_STRING, "ser_end", NOTSPECIFIED, "serial number to end (not saved)"}, |
12 |
{ARG_STRING, "date_beg", NOTSPECIFIED, "date to begin"}, |
13 |
{ARG_STRING, "date_end", NOTSPECIFIED, "date to end (not saved)"}, |
14 |
{ARG_STRING, "spath", "/archive/pfss/kitrun48/surffield-serial", ""}, |
15 |
{ARG_STRING, "bpath", "/archive/pfss/kitrun48/Bfield-serial", ""}, |
16 |
{ARG_STRING, "sbase", "%s/kitrun048_%5.5d.sav", "surface base file name"}, |
17 |
{ARG_STRING, "bbase", "%s/Bfield_%5.5d.sav", "B field base file name"}, |
18 |
{ARG_FLAG, "h", "0", "Print usage message and quit"}, |
19 |
{ARG_FLAG, "v", "0", "verbose flag"}, |
20 |
{ARG_END} |
21 |
}; |
22 |
|
23 |
char *module_name = "pfss_backup"; |
24 |
int verbose = 0; |
25 |
|
26 |
void sprint_time_ISO (char *tstring, TIME t) |
27 |
{ |
28 |
sprint_at(tstring,t); |
29 |
tstring[4] = tstring[7] = '-'; |
30 |
tstring[10] = 'T'; |
31 |
tstring[19] = '\0'; |
32 |
} |
33 |
|
34 |
int nice_intro(int help) |
35 |
{ |
36 |
int usage = cmdparams_get_int(&cmdparams, "h", NULL) != 0; |
37 |
verbose = cmdparams_get_int(&cmdparams, "v", NULL) != 0; |
38 |
if (usage || help) { |
39 |
printf("pfss_backup -h -v ds=output_series ser_beg=sn1 ser_end=sn_stop\n" |
40 |
" -h: print this message\n" |
41 |
" -v: verbose\n" |
42 |
"ds=<output series name> default is lm_jps.pfss\n" |
43 |
"ser_beg=<first serial number to backup>\n" |
44 |
"ser_end=<serial number to stop> (not backup)\n" |
45 |
"date_beg=<first date to backup>\n" |
46 |
"date_end=<date to stop> (not backup)\n" |
47 |
"spath=<base path to surface field files>\n" |
48 |
"bpath=<base path to B field files>\n" |
49 |
"sbase=<surface field base file name>\n" |
50 |
"bbase=<B field field base file name>\n"); |
51 |
return(1); |
52 |
} |
53 |
return(0); |
54 |
} |
55 |
|
56 |
int DoIt () |
57 |
{ |
58 |
char *date_beg, *date_end, *ds, *spath, *bpath, *sbase, *bbase; |
59 |
char sname[512], bname[512], now_str[64]; |
60 |
int ser_beg, ser_end, ser_num, status=0; |
61 |
int s_ok, b_ok, sp_ok, bp_ok; /* yr, mo, da, hr, mn; */ |
62 |
time_t trec, tnow; |
63 |
DRMS_Record_t *outrec; |
64 |
DRMS_Segment_t *outseg; |
65 |
struct tm tm_rec; |
66 |
struct stat sbuf; |
67 |
|
68 |
if (nice_intro(0)) return(0); |
69 |
ser_beg = cmdparams_get_int(&cmdparams, "ser_beg", NULL); |
70 |
ser_end = cmdparams_get_int(&cmdparams, "ser_end", NULL); |
71 |
ds = strdup(cmdparams_get_str(&cmdparams, "ds", NULL)); |
72 |
spath = strdup(cmdparams_get_str(&cmdparams, "spath", NULL)); |
73 |
bpath = strdup(cmdparams_get_str(&cmdparams, "bpath", NULL)); |
74 |
sbase = strdup(cmdparams_get_str(&cmdparams, "sbase", NULL)); |
75 |
bbase = strdup(cmdparams_get_str(&cmdparams, "bbase", NULL)); |
76 |
if (verbose) fprintf(stdout, "'%s'\n'%s'\n", spath, bpath); |
77 |
if (verbose) fprintf(stdout, "'%s'\n'%s'\n", sbase, bbase); |
78 |
if (ser_beg < 0) { |
79 |
time_t tr_b, tr_e; |
80 |
date_beg = strdup(cmdparams_get_str(&cmdparams, "date_beg", NULL)); |
81 |
tr_b = sscan_time(date_beg) - UNIX_EPOCH + 218; |
82 |
ser_beg = (tr_b - 836179440)/21600; |
83 |
date_end = strdup(cmdparams_get_str(&cmdparams, "date_end", NULL)); |
84 |
tr_e = sscan_time(date_end) - UNIX_EPOCH + 218; |
85 |
ser_end = (tr_e - 836179440)/21600; |
86 |
if (verbose) { |
87 |
fprintf(stderr, "trec: %ld %ld,ser_beg, end: %d, %d\n",tr_b,tr_e,ser_beg,ser_end); |
88 |
} |
89 |
} |
90 |
if (stat(spath, &sbuf)) { |
91 |
sp_ok = 0; |
92 |
fprintf(stderr, "Can not stat %s\n", spath); |
93 |
// return(1); |
94 |
} else sp_ok = 1; |
95 |
if (stat(bpath, &sbuf)) { |
96 |
bp_ok = 0; |
97 |
fprintf(stderr, "Can not stat %s\n", bpath); |
98 |
// return(1); |
99 |
} else bp_ok = 1; |
100 |
|
101 |
//sleep(60); |
102 |
for (ser_num = ser_beg; ser_num < ser_end; ser_num++) { |
103 |
trec = 21600*ser_num + 836179440 - 8; |
104 |
if (verbose) { |
105 |
fprintf(stderr, "trec: %ld,ser_beg, end: %d, %d\n", trec, ser_beg, ser_end); |
106 |
} |
107 |
gmtime_r(&trec, &tm_rec); |
108 |
snprintf(sname, 512, sbase, spath, ser_num); |
109 |
snprintf(bname, 512, bbase, bpath, ser_num); |
110 |
outrec = drms_create_record(drms_env, ds, DRMS_PERMANENT, &status); |
111 |
if (status) DIE("Can't create output record"); |
112 |
// drms_setkey_time(outrec, "model_date", (double) (trec + UNIX_EPOCH)); |
113 |
sprint_time_ISO(now_str, trec + UNIX_EPOCH); |
114 |
drms_setkey_string(outrec, "model_date", now_str); |
115 |
if (verbose) fprintf(stderr, "model_date: %s\n", now_str); |
116 |
drms_setkey_int(outrec, "serial", ser_num); |
117 |
if (stat(sname, &sbuf)) { |
118 |
s_ok = 0; |
119 |
if (s_ok) fprintf(stderr, "Can not stat %s\n", sname); |
120 |
} else { |
121 |
s_ok = 1; |
122 |
// drms_setkey_time(outrec,"s_calc_date",(double)(sbuf.st_mtime+UNIX_EPOCH)); |
123 |
sprint_time_ISO(now_str, sbuf.st_mtime + UNIX_EPOCH); |
124 |
drms_setkey_string(outrec, "s_calc_date", now_str); |
125 |
} |
126 |
if (stat(bname, &sbuf)) { |
127 |
b_ok = 0; |
128 |
if (b_ok) fprintf(stderr, "Can not stat %s\n", bname); |
129 |
} else { |
130 |
b_ok = 1; |
131 |
// drms_setkey_time(outrec,"b_calc_date",(double)(sbuf.st_mtime+UNIX_EPOCH)); |
132 |
sprint_time_ISO(now_str, sbuf.st_mtime + UNIX_EPOCH); |
133 |
drms_setkey_string(outrec, "b_calc_date", now_str); |
134 |
} |
135 |
tnow = CURRENT_SYSTEM_TIME; |
136 |
drms_setkey_time(outrec, "backup_date", tnow); |
137 |
sprint_time_ISO(now_str, tnow); |
138 |
if (s_ok) { |
139 |
outseg = drms_segment_lookup(outrec, "surffield"); |
140 |
if(drms_segment_write_from_file(outseg, sname)) { |
141 |
fprintf(stderr, "Can not write surface field segment for %s.\n", sname); |
142 |
} |
143 |
} |
144 |
if (b_ok) { |
145 |
outseg = drms_segment_lookup(outrec, "Bfield"); |
146 |
if(drms_segment_write_from_file(outseg, bname)) { |
147 |
fprintf(stderr, "Can not write B field segment for %s.\n", bname); |
148 |
} |
149 |
} |
150 |
if (s_ok || b_ok) status = drms_close_record(outrec, DRMS_INSERT_RECORD); |
151 |
else status = drms_close_record(outrec, DRMS_FREE_RECORD); |
152 |
if(status) fprintf(stderr, "Error closing rec for ser #: %d.\n", ser_num); |
153 |
} |
154 |
return status; |
155 |
} |