From d9e7690dc169c82d0011ca0a49f74e980f707b0b Mon Sep 17 00:00:00 2001 From: Jonathan McCrohan Date: Sun, 12 Feb 2012 23:25:19 +0000 Subject: Add ftp upload function + add documentation. --- Makefile | 13 +++++-- README | 9 +++++ src/ftphelper.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ftpupload | 21 +++++++++++ src/modbuslog.cfg | 7 ++++ 5 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/ftphelper.c create mode 100755 src/ftpupload diff --git a/Makefile b/Makefile index c4a7d89..e4b2a0f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,14 @@ CC=gcc -CFLAGS=-I/usr/include/modbus -LIBS=-lmodbus -lconfig SDIR=src +MODBUSLOGCFLAGS=-I/usr/include/modbus +MODBUSLOGLIBS=-lmodbus -lconfig +FTPHELPERCFLAGS= +FTPHELPERLIBS=-lconfig + +all: modbuslog ftphelper modbuslog: $(SDIR)/modbuslog.c - $(CC) -o $(SDIR)/$@ $^ $(CFLAGS) $(LIBS) + $(CC) -o $(SDIR)/$@ $^ $(MODBUSLOGCFLAGS) $(MODBUSLOGLIBS) + +ftphelper: $(SDIR)/ftphelper.c + $(CC) -o $(SDIR)/$@ $^ $(FTPHELPERCFLAGS) $(FTPHELPERLIBS) diff --git a/README b/README index 8627442..4815b3f 100644 --- a/README +++ b/README @@ -37,6 +37,8 @@ Required files: -------------------- /sbin/modbuslog executable program +/usr/bin/ftpupload ftp upload script +/usr/bin/ftphelper ftp upload script helper /etc/modbuslog.cfg configuration file /var/modbuslog/ output directory where logs are stored /var/modbuslog/interval/interval.txt textfile storing unique interval @@ -57,6 +59,13 @@ device, These include: 5) stop_bits stop bits, commonly 1. 6) retry number of retries for each failed reading. +The ftp section defines the parameters for the ftp upload function. The +required parameters are: + 1) server address of remote ftp server + 2) username ftp username + 3) password ftp password + 4) directory directory on ftp server files will be uploaded to + The reading section defines the unique reading times that the program is required to log at. Each entry must contain: 1) slaveid modbus slave id diff --git a/src/ftphelper.c b/src/ftphelper.c new file mode 100644 index 0000000..ffa289c --- /dev/null +++ b/src/ftphelper.c @@ -0,0 +1,104 @@ +/* + * ftphelper + * + * Copyright (C) 2012 Jonathan McCrohan + * + * 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 3 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, see . + */ + +// gcc ftphelper.c -o ftphelper `pkg-config --libs --cflags libconfig` +#include +#include +#include +#include +#include +#include +#include + +char *mac_address() { + int s; + struct ifreq ifr; + + s = socket(PF_INET, SOCK_DGRAM, 0); + memset(&ifr, 0x00, sizeof(ifr)); + strcpy(ifr.ifr_name, "eth0"); + ioctl(s, SIOCGIFHWADDR, &ifr); + close(s); + + static char mac_address[12]; + sprintf(mac_address, "%.2X%.2X%.2X%.2X%.2X%.2X", + (unsigned char) ifr.ifr_hwaddr.sa_data[0], + (unsigned char) ifr.ifr_hwaddr.sa_data[1], + (unsigned char) ifr.ifr_hwaddr.sa_data[2], + (unsigned char) ifr.ifr_hwaddr.sa_data[3], + (unsigned char) ifr.ifr_hwaddr.sa_data[4], + (unsigned char) ifr.ifr_hwaddr.sa_data[5]); + + return mac_address; +} + +int main(int argc, char *argv[]) { + + if (argc == 1) { + return 0; + } + + if (strcmp(argv[1], "--mac") == 0) { + printf("%s", mac_address()); + return 0; + } + + const char *configfile = "/etc/modbuslog.cfg"; + config_t cfg; + const char *ftp_server; + const char *ftp_username; + const char *ftp_password; + const char *ftp_directory; + + config_init(&cfg); + + if (!config_read_file(&cfg, configfile)) { + fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), + config_error_line(&cfg), config_error_text(&cfg)); + config_destroy(&cfg); + fprintf(stderr, "Unable to find configfile.\n"); + return 1; + } + + if (!(config_lookup_string(&cfg, "ftp.server", &ftp_server) + && config_lookup_string(&cfg, "ftp.username", &ftp_username) + && config_lookup_string(&cfg, "ftp.password", &ftp_password) + && config_lookup_string(&cfg, "ftp.directory", &ftp_directory))) { + fprintf(stderr, + "Incomplete ftp configuration. Check configuration file.\n"); + return 1; + } + + if (strcmp(argv[1], "--server") == 0) { + printf("%s", ftp_server); + return 0; + } + if (strcmp(argv[1], "--username") == 0) { + printf("%s", ftp_username); + return 0; + } + if (strcmp(argv[1], "--password") == 0) { + printf("%s", ftp_password); + return 0; + } + if (strcmp(argv[1], "--directory") == 0) { + printf("%s", ftp_directory); + return 0; + } +} diff --git a/src/ftpupload b/src/ftpupload new file mode 100755 index 0000000..a5f565b --- /dev/null +++ b/src/ftpupload @@ -0,0 +1,21 @@ +#!/bin/sh + +# ftpupload +# +# Copyright (C) 2012 Jonathan McCrohan + +USERNAME=`/usr/bin/ftphelper --username` +PASSWORD=`/usr/bin/ftphelper --password` +SERVER=`/usr/bin/ftphelper --server` +REMOTEDIRECTORY=`/usr/bin/ftphelper --directory` + +# local file to be uploaded +FILE="/var/modbuslog/"`/usr/bin/ftphelper --mac`"_"`date +%Y_%m_%d --date='1 days ago'`"_00_00_00.log" + +# login to remote server and upload +ftp -n -i $SERVER <