/* DESC: A script that can be used for a longtime logging of a NetModule Router. * The upper part of the script is the logger template. The lower part is the real programm, where you describe the settings and workflow. * Copyright (C) 2014 NetModule AG, Switzerland */ template logger { workfile="current.csv"; serialNumber=nb_status('system').SERIAL_NUMBER; currentFilename=""; currentLogStart=0; // the current logfile was startet at this time intervall=5; // new logentry every # seconds logfileIntervall=3600; // new logfile every # seconds // due to the fact that we cannot see the amount of free space in the sdk // we need to improvise and add up the current filesizes currentLogSize=0; // in Bytes maxLogSize=15000000; // in Bytes freespace=1000000; // in Bytes # give the constructor the absolute path to store the Loggs into void logger(string path) { dh=opendir(path); if(dh == -1) { if ( mkdir(path,0666) == -1 ); { nb_syslog("Could not create dir: %s. Exiting",path); exit(1); } } else { nb_syslog("directory already existent: %s", path); closedir(dh); } this.path = path; this.fields = mkarray(); namepart=strftime("%Y%m%d_%H%M%S_start.csv",localtime(time())); this.currentFilename=sprintf("%s_%s",this.serialNumber, namepart); } int jiffy() { sys = sysinfo(); u = struct_get(sys, "uptime"); if (is_void(u) || u < 1) { return 0; } else { return u; } } int addField(string fieldname) { if (strlen(fieldname) > 0 ) { this.fields = array_merge(this.fields, fieldname); return 0; } else { nb_syslog("Fieldname to short, not adding"); return -1; } } int addFields(array localFields) { for (i=0; i < length(localFields); i++) { if (this.addField(localFields[i]) == -1 ) return -1; } return 0; } int newLogfile() { // check if file if we have a work file an rename it to currentFile fd=fopen(sprintf("%s%s", this.path,this.workfile),"r" ); if(fd) { // we have a current workfile lets rename it fclose(fd); if(!rename(sprintf("%s%s",this.path,this.workfile), sprintf("%s%s",this.path,this.currentFilename))){ nb_syslog("Could not rename %s to %s, %s will be deleted",this.workfile, this.currentFilename,this.workfile); remove(sprintf("%s%s",this.path,this.workfile)); } } //set new current Filename as we stored the old one away namepart=strftime("%Y%m%d_%H%M%S.csv",localtime(time())); this.currentFilename=sprintf("%s_%s",this.serialNumber,namepart); this.currentLogStart=this.jiffy(); //creating Header header=""; for (i=0; i < length(this.fields); i++) { header=sprintf('%s%s;',header,this.fields[i]); } if(this.addLineToFile(header) == -1 ) { nb_syslog("writing of header to file: %s%s:", this.path,this.workfile); return -1; } else { return 0; } } int addLineToFile(string line) { fd=fopen(sprintf("%s%s", this.path,this.workfile),"a" ); if (fd < 0 ) { nb_syslog("could not open file %s%s", this.path, this.workfile); } if(!fwrite(fd,sprintf("%s\n",line))) { nb_syslog("writing of line to file: %s%s:", this.path,this.workfile); fclose(fd); return -1; } else { fclose(fd); return 0; } } int filesize(string file) { fd=fopen(file,"r"); if (fd) { fseek(fd,-1); size=ftell(fd); fclose(fd); return size; } else { return -1; } } int logNow() { //get current status output sections=mkarray("system","wan","wwan","wlan","gnss","lan","openvpn","ipsec","dio","license", "hotspot"); status=mkstruct(); for (i=0;i