pbs_queue *que_recov( char *filename) /* pathname to queue save file */ { int fds; int i; pbs_queue *pq; char namebuf[MAXPATHLEN]; time_t time_now = time(NULL); pq = que_alloc(filename, TRUE); /* allocate & init queue structure space */ if (pq == NULL) { log_err(-1, __func__, "que_alloc failed"); return(NULL); } snprintf(namebuf, sizeof(namebuf), "%s%s", path_queues, filename); fds = open(namebuf, O_RDONLY, 0); if (fds < 0) { log_err(errno, __func__, "open error"); que_free(pq, TRUE); return(NULL); } /* read in queue save sub-structure */ if (read_ac_socket(fds, (char *)&pq->qu_qs, sizeof(queuefix)) != sizeof(queuefix)) { log_err(errno, __func__, "read error"); que_free(pq, TRUE); close(fds); return ((pbs_queue *)0); } /* read in queue attributes */ if (recov_attr(fds, pq, que_attr_def, pq->qu_attr, QA_ATR_LAST, 0, TRUE) != 0) { log_err(-1, __func__, "recov_attr[common] failed"); que_free(pq, TRUE); close(fds); return ((pbs_queue *)0); } /* * now reload the access control lists, these attributes were * saved separately */ for (i = 0;i < QA_ATR_LAST;i++) { if (pq->qu_attr[i].at_type == ATR_TYPE_ACL) { recov_acl( &pq->qu_attr[i], &que_attr_def[i], que_attr_def[i].at_name, pq->qu_qs.qu_name); } } /* all done recovering the queue */ close(fds); if ((pq->qu_attr[QA_ATR_MTime].at_flags & ATR_VFLAG_SET) == 0) { /* if we are recovering a pre-2.1.2 queue, save a new mtime */ pq->qu_attr[QA_ATR_MTime].at_val.at_long = time_now; pq->qu_attr[QA_ATR_MTime].at_flags = ATR_VFLAG_SET; que_save(pq); } return(pq); }
pbs_queue * que_recov_fs(char *filename) { int fds; int i; pbs_queue *pq; pq = que_alloc(filename); /* allocate & init queue structure space */ if (pq == (pbs_queue *)0) { log_err(-1, "que_recov", "que_alloc failed"); return ((pbs_queue *)0); } (void)strcpy(pbs_recov_filename, path_queues); (void)strcat(pbs_recov_filename, filename); #ifdef WIN32 fix_perms(pbs_recov_filename); #endif fds = open(pbs_recov_filename, O_RDONLY, 0); if (fds < 0) { sprintf(log_buffer, "error opening %s", pbs_recov_filename); log_err(errno, "que_recov", log_buffer); free((char *)pq); return ((pbs_queue *)0); } #ifdef WIN32 setmode(fds, O_BINARY); #endif /* read in queue save sub-structure */ errno = -1; if (read(fds, (char *)&pq->qu_qs, sizeof(struct queuefix)) != sizeof(struct queuefix)) { sprintf(log_buffer, "error reading %s", pbs_recov_filename); log_err(errno, "que_recov", log_buffer); free((char *)pq); (void)close(fds); return ((pbs_queue *)0); } /* read in queue attributes */ if (recov_attr_fs(fds, pq, que_attr_def, pq->qu_attr, (int)QA_ATR_LAST, 0) != 0) { log_err(-1, "que_recov", "recov_attr[common] failed"); que_free(pq); (void)close(fds); return ((pbs_queue *)0); } /* * now reload the access control lists, these attributes were * saved separately */ for (i=0; i < (int)QA_ATR_LAST; i++) { if (pq->qu_attr[i].at_type == ATR_TYPE_ACL) { recov_acl(&pq->qu_attr[i], &que_attr_def[i], que_attr_def[i].at_name, pq->qu_qs.qu_name); } } /* all done recovering the queue */ (void)close(fds); return (pq); }
int svr_recov( char *svrfile, /* I */ int read_only) /* I */ { int i; int sdb; char log_buf[LOCAL_LOG_BUF_SIZE]; void recov_acl(pbs_attribute *, attribute_def *, const char *, const char *); sdb = open(svrfile, O_RDONLY, 0); if (sdb < 0) { if (errno == ENOENT) { char tmpLine[LOG_BUF_SIZE]; snprintf(tmpLine, sizeof(tmpLine), "cannot locate server database '%s' - use 'pbs_server -t create' to create new database if database has not been initialized.", svrfile); log_err(errno, __func__, tmpLine); } else { log_err(errno, __func__, msg_svdbopen); } return(-1); } /* read in server structure */ lock_sv_qs_mutex(server.sv_qs_mutex, __func__); i = read_ac_socket(sdb, (char *) & server.sv_qs, sizeof(server_qs)); if (i != sizeof(server_qs)) { unlock_sv_qs_mutex(server.sv_qs_mutex, log_buf); if (i < 0) log_err(errno, __func__, "read of serverdb failed"); else log_err(errno, __func__, "short read of serverdb"); close(sdb); return(-1); } /* Save the sv_jobidnumber field in case it is set by the attributes. */ i = server.sv_qs.sv_jobidnumber; /* read in server attributes */ if (recov_attr( sdb, &server, svr_attr_def, server.sv_attr, SRV_ATR_LAST, 0, !read_only) != 0 ) { unlock_sv_qs_mutex(server.sv_qs_mutex, log_buf); log_err(errno, __func__, "error on recovering server attr"); close(sdb); return(-1); } /* Restore the current job number and make it visible in qmgr print server commnad. */ if (!read_only) { server.sv_qs.sv_jobidnumber = i; server.sv_attr[SRV_ATR_NextJobNumber].at_val.at_long = i; server.sv_attr[SRV_ATR_NextJobNumber].at_flags |= ATR_VFLAG_SET| ATR_VFLAG_MODIFY; } unlock_sv_qs_mutex(server.sv_qs_mutex, __func__); close(sdb); /* recover the server various acls from their own files */ for (i = 0;i < SRV_ATR_LAST;i++) { if (server.sv_attr[i].at_type == ATR_TYPE_ACL) { recov_acl( &server.sv_attr[i], &svr_attr_def[i], PBS_SVRACL, svr_attr_def[i].at_name); if ((!read_only) && (svr_attr_def[i].at_action != (int (*)(pbs_attribute*, void*, int))0)) { svr_attr_def[i].at_action( &server.sv_attr[i], &server, ATR_ACTION_RECOV); } } } /* END for (i) */ return(PBSE_NONE); } /* END svr_recov() */
int svr_recov( char *svrfile, /* I */ int read_only) /* I */ { static char *id = "svr_recov"; int i; int sdb; void recov_acl(attribute *, attribute_def *, char *, char *); sdb = open(svrfile, O_RDONLY, 0); if (sdb < 0) { if (errno == ENOENT) { char tmpLine[LOG_BUF_SIZE]; snprintf(tmpLine, sizeof(tmpLine), "cannot locate server database '%s' - use 'pbs_server -t create' to create new database if database has not been initialized.", svrfile); log_err(errno, id, tmpLine); } else { log_err(errno, id, msg_svdbopen); } return(-1); } /* read in server structure */ i = read(sdb, (char *) & server.sv_qs, sizeof(struct server_qs)); if (i != sizeof(struct server_qs)) { if (i < 0) log_err(errno, id, "read of serverdb failed"); else log_err(errno, id, "short read of serverdb"); close(sdb); return(-1); } if (strstr((char *)&server.sv_qs,"<server_db>") != NULL) { /* attempt to read the server database in xml */ log_event(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, "serverdb appears to be in xml format, attempting to read xml\n"); return(svr_recov_xml(svrfile,read_only)); } /* Save the sv_jobidnumber field in case it is set by the attributes. */ i = server.sv_qs.sv_jobidnumber; /* read in server attributes */ if (recov_attr( sdb, &server, svr_attr_def, server.sv_attr, (int)SRV_ATR_LAST, 0, !read_only) != 0 ) { log_err(errno, id, "error on recovering server attr"); close(sdb); return(-1); } /* Restore the current job number and make it visible in qmgr print server commnad. */ if (!read_only) { server.sv_qs.sv_jobidnumber = i; server.sv_attr[(int)SRV_ATR_NextJobNumber].at_val.at_long = i; server.sv_attr[(int)SRV_ATR_NextJobNumber].at_flags |= ATR_VFLAG_SET| ATR_VFLAG_MODIFY; } close(sdb); /* recover the server various acls from their own files */ for (i = 0;i < SRV_ATR_LAST;i++) { if (server.sv_attr[i].at_type == ATR_TYPE_ACL) { recov_acl( &server.sv_attr[i], &svr_attr_def[i], PBS_SVRACL, svr_attr_def[i].at_name); if ((!read_only) && (svr_attr_def[i].at_action != (int (*)())0)) { svr_attr_def[i].at_action( &server.sv_attr[i], &server, ATR_ACTION_RECOV); } } } /* END for (i) */ return(0); } /* END svr_recov() */