From e3c4c196a45a9a39dcf1201b3a8bcba54d41788c Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Fri, 9 Jan 2004 14:09:41 +0000 Subject: [PATCH] Added 'last submission' option SVN revision: 655 --- doc/config.html | 24 ++++-- src/elogd.c | 219 +++++++++++++++++++++++++++++------------------- 2 files changed, 151 insertions(+), 92 deletions(-) diff --git a/doc/config.html b/doc/config.html index aa8019ab..07f3b8f1 100755 --- a/doc/config.html +++ b/doc/config.html @@ -904,6 +904,14 @@ in elogd by default and has to be enabled explicitly with the "-x" command line The administrator has to ensure then of course that only trusted people can edit elogd.cfg.

+

  • Last submission = <string> +
    +This option determines what gets displayed on the logbook selection page in the +Last submission colum. The default string is $date by $author. If +a logbook does not contain an author attribute, another string can +be chosen. +

    +


    @@ -915,10 +923,10 @@ depending on the value of other attributes. Let's assume you have a logbook cont for different computers with different operating systems. Your elogd.cfg file starts like that:

    -

    +
       Attributes = PC Name, Operating System, Version
       Options Operating System = Linux, Windows
      -
      +

    For the operating system version, you would like a list, but this list has to be different @@ -926,12 +934,12 @@ for Linux and Windows. This can be achieved with conditional attributes. following configuration:

    -

    +
       Attributes = PC Name, Operating System, Version
       Options Operating System = Linux{1}, Windows{2}
       {1} Options Version = 2.2, 2.4, 2.6
       {2} Options Version = ME, 2k, NT, XP
      -
      +

    If you enter a new entry into that logbook, the drop-down list for Version @@ -954,24 +962,24 @@ of forms. Depending on an attribute, the configuration option the message body, which can then be filled out. Consider following example:

    -

    +
       Attributes = Author, Type
       Options Type = Network check{1}, System check{2}
       
       {1} Preset text = network.txt
       {2} Preset text = system.txt
      -
      +

    This causes two text files network.txt and system.txt to be copied into the message body when a new entry is made. The file network.txt could look like:

    -

    +
       Routers checked:  [ ]
       DHCP checked:     [ ]
       Comment: ...
      -
      +

    This works like a pre-defined form, the user puts X's between the "[ ]" when that diff --git a/src/elogd.c b/src/elogd.c index 0413459f..185b6d7c 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.176 2004/01/09 14:09:41 midas + Added 'last submission' option + Revision 1.175 2004/01/07 15:04:03 midas Check for duplicate logbooks @@ -382,9 +385,10 @@ typedef struct LBNODE *LBLIST; struct LBNODE { char name[256]; - LBLIST member; + LBLIST *member; int n_members; - int subgroup; + int is_subgroup; + int is_top; } LBNODE; typedef struct { @@ -2373,7 +2377,7 @@ int el_index_logbooks(BOOL reinit) continue; /* check for duplicate name */ - for (j=0 ; jmember = malloc(sizeof(void *)); else - lbl = realloc(lbl, (n + 1) * sizeof(LBNODE)); - memset(lbl + n, 0, sizeof(LBNODE)); + root->member = realloc(root->member, (n + 1) * sizeof(void *)); + root->member[n] = malloc(sizeof(LBNODE)); if (strlen(grpname) < 7) - strlcpy(lbl[n].name, "Invalid group definition!", 256); + strlcpy(root->member[n]->name, "Invalid group definition!", 256); + else if (flag == 1) + strlcpy(root->member[n]->name, grpname + 6, 256); else - strlcpy(lbl[n].name, grpname + 6, 256); - m = strbreak(grpmembers, grplist, MAX_N_LIST); - lbl[n].n_members = m; + strlcpy(root->member[n]->name, grpname + 10, 256); - lbl[n].member = calloc(sizeof(LBNODE), m); - for (j = 0; j < m; j++) - strlcpy(lbl[n].member[j].name, grplist[j], 256); + m = strbreak(grpmembers, grplist, MAX_N_LIST); + root->member[n]->n_members = m; + + root->member[n]->member = calloc(sizeof(void *), m); + root->member[n]->n_members = m; + for (j = 0; j < m; j++) { + root->member[n]->member[j] = calloc(sizeof(LBNODE), 1); + strlcpy(root->member[n]->member[j]->name, grplist[j], 256); + } + + root->member[n]->is_top = (flag == 2); n++; } } + root->n_members = n; + /* populate nodes with logbooks or other groups */ - for (i = 0; i < n; i++) - for (j = 0; j < lbl[i].n_members; j++) { + for (i = 0; i < root->n_members; i++) + for (j = 0; j < root->member[i]->n_members; j++) { /* check if node is valid logbook */ for (k = 0; lb_list[k].name[0]; k++) - if (equal_ustring(lbl[i].member[j].name, lb_list[k].name)) + if (equal_ustring(root->member[i]->member[j]->name, lb_list[k].name)) break; - /* check if node is other node */ + /* check if node is subgroup of other node */ if (!lb_list[k].name[0]) { for (k = 0; k < n; k++) - if (equal_ustring(lbl[i].member[j].name, lbl[k].name)) { - lbl[i].member[j].member = lbl[k].member; - lbl[i].member[j].n_members = lbl[k].n_members; + if (equal_ustring(root->member[i]->member[j]->name, root->member[k]->name)) { - /* mark group as subgroup */ - lbl[k].subgroup = 1; + /* node is allocated twice, so free one... */ + free(root->member[i]->member[j]); + + /* ... and reference the other */ + root->member[i]->member[j] = root->member[k]; + + /* mark original pointer invalid */ + root->member[k] = NULL; break; } } @@ -4404,42 +4435,60 @@ int get_logbook_hierarchy(LBLIST * lblist) for (n = 0; lb_list[n].name[0]; n++); /* make simple list with logbooks */ - lbl = calloc(n, sizeof(LBNODE)); - for (i = 0; i < n; i++) - strlcpy(lbl[i].name, lb_list[i].name, 256); + root->member = calloc(n, sizeof(void *)); + + for (i = 0; i < n; i++) { + root->member[i] = calloc(1, sizeof(LBNODE)); + strlcpy(root->member[i]->name, lb_list[i].name, 256); + } } - *lblist = lbl; - - return n; + return root; } -int is_logbook_in_group(LBLIST lbl, char *logbook) +/*------------------------------------------------------------------*/ + +void free_logbook_hierarchy(LBLIST root) { int i; - if (equal_ustring(lbl->name, logbook)) + for (i = 0; i < root->n_members; i++) { + if (root->member[i] != NULL) + free_logbook_hierarchy(root->member[i]); + + free(root->member); + free(root); + } +} + +/*------------------------------------------------------------------*/ + +int is_logbook_in_group(LBLIST pgrp, char *logbook) +/* test if "logbook" is in group node plb */ +{ + int i; + + if (equal_ustring(pgrp->name, logbook)) return 1; - for (i = 0; i < lbl->n_members; i++) { - if (equal_ustring(logbook, lbl->member[i].name)) + for (i = 0; i < pgrp->n_members; i++) { + if (equal_ustring(logbook, pgrp->member[i]->name)) return 1; - if (lbl->member[i].n_members > 0 && is_logbook_in_group(&(lbl->member[i]), logbook)) + if (pgrp->member[i]->n_members > 0 && is_logbook_in_group(pgrp->member[i], logbook)) return 1; } return 0; } - /*------------------------------------------------------------------*/ void show_standard_title(char *logbook, char *text, int printable) { char str[256], ref[256], sclass[32]; - int i, j, n_grp, n_lb, nnum, level; - LBLIST clb, flb, nlb, lbl; + int i, j, level; + LBLIST phier, pnode, pnext, flb; if (printable) rsprintf @@ -4449,53 +4498,58 @@ void show_standard_title(char *logbook, char *text, int printable) ("\n\n"); /* scan logbook hierarchy */ - n_grp = get_logbook_hierarchy(&lbl); + phier = get_logbook_hierarchy(); /*---- logbook selection row ----*/ - clb = lbl; - nlb = NULL; - n_lb = n_grp; + pnode = phier; /* start at root of tree */ + pnext = NULL; + if (!printable && getcfg(logbook, "logbook tabs", str) && atoi(str) == 1) { + for (level = 0;; level++) { rsprintf("\n\n"); - clb = nlb; - n_lb = nnum; + pnode = pnext; + pnext = NULL; - if (nlb == NULL) + if (pnode == NULL) break; - } } - /* free logbook node memory */ - for (i = 0; i < n_grp; i++) - if (lbl[i].member) - free(lbl[i].member); - - free(lbl); + free_logbook_hierarchy(phier); /*---- title row ----*/ @@ -8681,7 +8732,7 @@ void show_page_filters(LOGBOOK * lbs, int n_msg, int page_n, int n_page, BOOL to ("\n", list[index], getparam(list[index])); } else { - rsprintf("\n", list[index]); rsprintf("
    \n"); if (level == 0 && getcfg("global", "main tab", str)) rsprintf("%s\n", str); - for (i = 0; i < n_lb; i++) { - if (level == 0 && clb[i].subgroup) // check for subgroup + /* iterate through members of this group */ + for (i = 0; i < pnode->n_members; i++) { + + /* check if valid node */ + if (pnode->member[i] == NULL) continue; - if (getcfg(clb[i].name, "Hidden", str) && atoi(str) == 1) + if (getcfg(pnode->member[i]->name, "Hidden", str) && atoi(str) == 1) continue; - strlcpy(str, clb[i].name, sizeof(str)); + strlcpy(str, pnode->member[i]->name, sizeof(str)); /* build reference to first logbook in group */ - if (clb[i].member == NULL) + if (pnode->member[i]->member == NULL) strlcpy(ref, str, sizeof(ref)); // current node is logbook else { - flb = &clb[i].member[0]; // current node is group + flb = pnode->member[i]->member[0]; // current node is group while (flb->member) // so traverse hierarchy - flb = &flb->member[0]; + flb = flb->member[0]; strlcpy(ref, flb->name, sizeof(ref)); } url_encode(ref, sizeof(ref)); - if (is_logbook_in_group(&clb[i], logbook)) { - nlb = clb[i].member; - nnum = clb[i].n_members; + if (is_logbook_in_group(pnode->member[i], logbook)) { - if (clb[i].member == NULL) + /* remember member list of this group for next row */ + pnext = pnode->member[i]; + + if (pnode->member[i]->member == NULL) /* selected logbook */ strcpy(sclass, "sltab"); else /* selected group */ strcpy(sclass, "sgtab"); } else { - if (clb[i].member == NULL) + if (pnode->member[i]->member == NULL) /* unselected logbook */ strcpy(sclass, "ltab"); else @@ -4503,36 +4557,33 @@ void show_standard_title(char *logbook, char *text, int printable) strcpy(sclass, "gtab"); } - // rsprintf(" ", sclass, sclass, ref); - rsprintf("", sclass, ref); + if (!pnode->member[i]->is_top) { - strlcpy(str, clb[i].name, sizeof(str)); + rsprintf("", sclass, ref); - for (j = 0; j < (int) strlen(str); j++) - if (str[j] == ' ') - rsprintf(" "); - else - rsprintf("%c", str[j]); + strlcpy(str, pnode->member[i]->name, sizeof(str)); - rsprintf("\n"); + for (j = 0; j < (int) strlen(str); j++) + if (str[j] == ' ') + rsprintf(" "); + else + rsprintf("%c", str[j]); + + rsprintf("\n"); + } } + rsprintf("