From 51313f986f0607362e7f679cdaf30f2180049520 Mon Sep 17 00:00:00 2001 From: sfeakes Date: Sat, 16 Jun 2018 16:58:31 -0500 Subject: [PATCH] first commit 1 --- Makefile | 61 +++ README.md | 1 + minIni/minGlue.h | 31 ++ minIni/minIni.c | 878 +++++++++++++++++++++++++++++++ minIni/minIni.h | 152 ++++++ release/install.sh | 97 ++++ release/sprinklerd | Bin 0 -> 206344 bytes release/sprinklerd.conf | 106 ++++ release/sprinklerd.defaults | 5 + release/sprinklerd.service | 21 + release/sprinklerd.service.avahi | 9 + sprinkler.cron | 5 + web/index.html | 448 ++++++++++++++++ 13 files changed, 1814 insertions(+) create mode 100755 Makefile create mode 100644 README.md create mode 100644 minIni/minGlue.h create mode 100644 minIni/minIni.c create mode 100644 minIni/minIni.h create mode 100755 release/install.sh create mode 100755 release/sprinklerd create mode 100644 release/sprinklerd.conf create mode 100644 release/sprinklerd.defaults create mode 100755 release/sprinklerd.service create mode 100644 release/sprinklerd.service.avahi create mode 100644 sprinkler.cron create mode 100644 web/index.html diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..ee9e72b --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# define the C compiler to use +CC = gcc + +LIBS := -lpthread -lwiringPi -lwiringPiDev -lm +#LIBS := -lpthread -lwebsockets + +# debug of not +#$DBG = -g +$DBG = + +# define any compile-time flags +#CFLAGS = -Wall -lpthread -lwiringPi -lwiringPiDev -lm -I. -I./minIni +CFLAGS = -Wall -I. -I./minIni $(DBG) $(LIBS) -D MG_DISABLE_MD5 -D MG_DISABLE_HTTP_DIGEST_AUTH -D MG_DISABLE_MD5 -D MG_DISABLE_JSON_RPC +#CFLAGS = -Wall -g -I./wiringPI + + +# define the C source files +SRCS = sprinkler.c utils.c config.c net_services.c json_messages.c zone_ctrl.c sd_cron.c mongoose.c minIni/minIni.c + +# define the C object files +# +# This uses Suffix Replacement within a macro: +# $(name:string1=string2) +# For each word in 'name' replace 'string1' with 'string2' +# Below we are replacing the suffix .c of all words in the macro SRCS +# with the .o suffix +# +OBJS = $(SRCS:.c=.o) + +# define the executable file +MAIN = ./release/sprinklerd + +# +# The following part of the makefile is generic; it can be used to +# build any executable just by changing the definitions above and by +# deleting dependencies appended to the file from 'make depend' +# + +.PHONY: depend clean + +all: $(MAIN) + @echo: $(MAIN) have been compiled + +$(MAIN): $(OBJS) + $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS) + +# this is a suffix replacement rule for building .o's from .c's +# it uses automatic variables $<: the name of the prerequisite of +# the rule(a .c file) and $@: the name of the target of the rule (a .o file) +# (see the gnu make manual section about automatic variables) +.c.o: + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + $(RM) *.o *~ $(MAIN) $(MAIN_U) + +depend: $(SRCS) + makedepend $(INCLUDES) $^ + +install: $(MAIN) + ./release/install.sh \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed9d833 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# sprinklerd diff --git a/minIni/minGlue.h b/minIni/minGlue.h new file mode 100644 index 0000000..2d47d90 --- /dev/null +++ b/minIni/minGlue.h @@ -0,0 +1,31 @@ +/* Glue functions for the minIni library, based on the C/C++ stdio library + * + * Or better said: this file contains macros that maps the function interface + * used by minIni to the standard C/C++ file I/O functions. + * + * By CompuPhase, 2008-2014 + * This "glue file" is in the public domain. It is distributed without + * warranties or conditions of any kind, either express or implied. + */ + +/* map required file I/O types and functions to the standard C library */ +#include + +#define INI_FILETYPE FILE* +#define ini_openread(filename,file) ((*(file) = fopen((filename),"rb")) != NULL) +#define ini_openwrite(filename,file) ((*(file) = fopen((filename),"wb")) != NULL) +#define ini_openrewrite(filename,file) ((*(file) = fopen((filename),"r+b")) != NULL) +#define ini_close(file) (fclose(*(file)) == 0) +#define ini_read(buffer,size,file) (fgets((buffer),(size),*(file)) != NULL) +#define ini_write(buffer,file) (fputs((buffer),*(file)) >= 0) +#define ini_rename(source,dest) (rename((source), (dest)) == 0) +#define ini_remove(filename) (remove(filename) == 0) + +#define INI_FILEPOS long int +#define ini_tell(file,pos) (*(pos) = ftell(*(file))) +#define ini_seek(file,pos) (fseek(*(file), *(pos), SEEK_SET) == 0) + +/* for floating-point support, define additional types and functions */ +#define INI_REAL float +#define ini_ftoa(string,value) sprintf((string),"%f",(value)) +#define ini_atof(string) (INI_REAL)strtod((string),NULL) diff --git a/minIni/minIni.c b/minIni/minIni.c new file mode 100644 index 0000000..4beb2cc --- /dev/null +++ b/minIni/minIni.c @@ -0,0 +1,878 @@ +/* minIni - Multi-Platform INI file parser, suitable for embedded systems + * + * These routines are in part based on the article "Multiplatform .INI Files" + * by Joseph J. Graf in the March 1994 issue of Dr. Dobb's Journal. + * + * Copyright (c) CompuPhase, 2008-2017 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Version: $Id: minIni.c 53 2015-01-18 13:35:11Z thiadmer.riemersma@gmail.com $ + */ + +#if (defined _UNICODE || defined __UNICODE__ || defined UNICODE) && !defined INI_ANSIONLY +# if !defined UNICODE /* for Windows */ +# define UNICODE +# endif +# if !defined _UNICODE /* for C library */ +# define _UNICODE +# endif +#endif + +#define MININI_IMPLEMENTATION +#include "minIni.h" +#if defined NDEBUG + #define assert(e) +#else + #include +#endif + +#if !defined __T || defined INI_ANSIONLY + #include + #include + #include + #define TCHAR char + #define __T(s) s + #define _tcscat strcat + #define _tcschr strchr + #define _tcscmp strcmp + #define _tcscpy strcpy + #define _tcsicmp stricmp + #define _tcslen strlen + #define _tcsncmp strncmp + #define _tcsnicmp strnicmp + #define _tcsrchr strrchr + #define _tcstol strtol + #define _tcstod strtod + #define _totupper toupper + #define _stprintf sprintf + #define _tfgets fgets + #define _tfputs fputs + #define _tfopen fopen + #define _tremove remove + #define _trename rename +#endif + +#if defined __linux || defined __linux__ + #define __LINUX__ +#elif defined FREEBSD && !defined __FreeBSD__ + #define __FreeBSD__ +#elif defined(_MSC_VER) + #pragma warning(disable: 4996) /* for Microsoft Visual C/C++ */ +#endif +#if !defined strnicmp && !defined PORTABLE_STRNICMP + #if defined __LINUX__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ + #define strnicmp strncasecmp + #endif +#endif +#if !defined _totupper + #define _totupper toupper +#endif + +#if !defined INI_LINETERM + #if defined __LINUX__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__ + #define INI_LINETERM __T("\n") + #else + #define INI_LINETERM __T("\r\n") + #endif +#endif +#if !defined INI_FILETYPE + #error Missing definition for INI_FILETYPE. +#endif + +#if !defined sizearray + #define sizearray(a) (sizeof(a) / sizeof((a)[0])) +#endif + +enum quote_option { + QUOTE_NONE, + QUOTE_ENQUOTE, + QUOTE_DEQUOTE, +}; + +#if defined PORTABLE_STRNICMP +int strnicmp(const TCHAR *s1, const TCHAR *s2, size_t n) +{ + while (n-- != 0 && (*s1 || *s2)) { + register int c1, c2; + c1 = *s1++; + if ('a' <= c1 && c1 <= 'z') + c1 += ('A' - 'a'); + c2 = *s2++; + if ('a' <= c2 && c2 <= 'z') + c2 += ('A' - 'a'); + if (c1 != c2) + return c1 - c2; + } /* while */ + return 0; +} +#endif /* PORTABLE_STRNICMP */ + +static TCHAR *skipleading(const TCHAR *str) +{ + assert(str != NULL); + while ('\0' < *str && *str <= ' ') + str++; + return (TCHAR *)str; +} + +static TCHAR *skiptrailing(const TCHAR *str, const TCHAR *base) +{ + assert(str != NULL); + assert(base != NULL); + while (str > base && '\0' < *(str-1) && *(str-1) <= ' ') + str--; + return (TCHAR *)str; +} + +static TCHAR *striptrailing(TCHAR *str) +{ + TCHAR *ptr = skiptrailing(_tcschr(str, '\0'), str); + assert(ptr != NULL); + *ptr = '\0'; + return str; +} + +static TCHAR *ini_strncpy(TCHAR *dest, const TCHAR *source, size_t maxlen, enum quote_option option) +{ + size_t d, s; + + assert(maxlen>0); + assert(source != NULL && dest != NULL); + assert((dest < source || (dest == source && option != QUOTE_ENQUOTE)) || dest > source + strlen(source)); + if (option == QUOTE_ENQUOTE && maxlen < 3) + option = QUOTE_NONE; /* cannot store two quotes and a terminating zero in less than 3 characters */ + + switch (option) { + case QUOTE_NONE: + for (d = 0; d < maxlen - 1 && source[d] != '\0'; d++) + dest[d] = source[d]; + assert(d < maxlen); + dest[d] = '\0'; + break; + case QUOTE_ENQUOTE: + d = 0; + dest[d++] = '"'; + for (s = 0; source[s] != '\0' && d < maxlen - 2; s++, d++) { + if (source[s] == '"') { + if (d >= maxlen - 3) + break; /* no space to store the escape character plus the one that follows it */ + dest[d++] = '\\'; + } /* if */ + dest[d] = source[s]; + } /* for */ + dest[d++] = '"'; + dest[d] = '\0'; + break; + case QUOTE_DEQUOTE: + for (d = s = 0; source[s] != '\0' && d < maxlen - 1; s++, d++) { + if ((source[s] == '"' || source[s] == '\\') && source[s + 1] == '"') + s++; + dest[d] = source[s]; + } /* for */ + dest[d] = '\0'; + break; + default: + assert(0); + } /* switch */ + + return dest; +} + +static TCHAR *cleanstring(TCHAR *string, enum quote_option *quotes) +{ + int isstring; + TCHAR *ep; + + assert(string != NULL); + assert(quotes != NULL); + + /* Remove a trailing comment */ + isstring = 0; + for (ep = string; *ep != '\0' && ((*ep != ';' && *ep != '#') || isstring); ep++) { + if (*ep == '"') { + if (*(ep + 1) == '"') + ep++; /* skip "" (both quotes) */ + else + isstring = !isstring; /* single quote, toggle isstring */ + } else if (*ep == '\\' && *(ep + 1) == '"') { + ep++; /* skip \" (both quotes */ + } /* if */ + } /* for */ + assert(ep != NULL && (*ep == '\0' || *ep == ';' || *ep == '#')); + *ep = '\0'; /* terminate at a comment */ + striptrailing(string); + /* Remove double quotes surrounding a value */ + *quotes = QUOTE_NONE; + if (*string == '"' && (ep = _tcschr(string, '\0')) != NULL && *(ep - 1) == '"') { + string++; + *--ep = '\0'; + *quotes = QUOTE_DEQUOTE; /* this is a string, so remove escaped characters */ + } /* if */ + return string; +} + +static int getkeystring(INI_FILETYPE *fp, const TCHAR *Section, const TCHAR *Key, + int idxSection, int idxKey, TCHAR *Buffer, int BufferSize, + INI_FILEPOS *mark) +{ + TCHAR *sp, *ep; + int len, idx; + enum quote_option quotes; + TCHAR LocalBuffer[INI_BUFFERSIZE]; + + assert(fp != NULL); + /* Move through file 1 line at a time until a section is matched or EOF. If + * parameter Section is NULL, only look at keys above the first section. If + * idxSection is postive, copy the relevant section name. + */ + len = (Section != NULL) ? (int)_tcslen(Section) : 0; + if (len > 0 || idxSection >= 0) { + assert(idxSection >= 0 || Section != NULL); + idx = -1; + do { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, fp)) + return 0; + sp = skipleading(LocalBuffer); + ep = _tcsrchr(sp, ']'); + } while (*sp != '[' || ep == NULL || + (((int)(ep-sp-1) != len || Section == NULL || _tcsnicmp(sp+1,Section,len) != 0) && ++idx != idxSection)); + if (idxSection >= 0) { + if (idx == idxSection) { + assert(ep != NULL); + assert(*ep == ']'); + *ep = '\0'; + ini_strncpy(Buffer, sp + 1, BufferSize, QUOTE_NONE); + return 1; + } /* if */ + return 0; /* no more section found */ + } /* if */ + } /* if */ + + /* Now that the section has been found, find the entry. + * Stop searching upon leaving the section's area. + */ + assert(Key != NULL || idxKey >= 0); + len = (Key != NULL) ? (int)_tcslen(Key) : 0; + idx = -1; + do { + if (mark != NULL) + ini_tell(fp, mark); /* optionally keep the mark to the start of the line */ + if (!ini_read(LocalBuffer,INI_BUFFERSIZE,fp) || *(sp = skipleading(LocalBuffer)) == '[') + return 0; + sp = skipleading(LocalBuffer); + ep = _tcschr(sp, '='); /* Parse out the equal sign */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + } while (*sp == ';' || *sp == '#' || ep == NULL + || ((len == 0 || (int)(skiptrailing(ep,sp)-sp) != len || _tcsnicmp(sp,Key,len) != 0) && ++idx != idxKey)); + if (idxKey >= 0) { + if (idx == idxKey) { + assert(ep != NULL); + assert(*ep == '=' || *ep == ':'); + *ep = '\0'; + striptrailing(sp); + ini_strncpy(Buffer, sp, BufferSize, QUOTE_NONE); + return 1; + } /* if */ + return 0; /* no more key found (in this section) */ + } /* if */ + + /* Copy up to BufferSize chars to buffer */ + assert(ep != NULL); + assert(*ep == '=' || *ep == ':'); + sp = skipleading(ep + 1); + sp = cleanstring(sp, "es); /* Remove a trailing comment */ + ini_strncpy(Buffer, sp, BufferSize, quotes); + return 1; +} + +/** ini_gets() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue default string in the event of a failed read + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_gets(const TCHAR *Section, const TCHAR *Key, const TCHAR *DefValue, + TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || Key == NULL) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, Key, -1, -1, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } /* if */ + if (!ok) { + ini_strncpy(Buffer, (DefValue != NULL) ? DefValue : __T(""), BufferSize, QUOTE_NONE); + //Buffer = DefValue; + } + return (int)_tcslen(Buffer); +} + +/** ini_getl() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue the default value in the event of a failed read + * \param Filename the name of the .ini file to read from + * + * \return the value located at Key + */ +long ini_getl(const TCHAR *Section, const TCHAR *Key, long DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + int len = ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + return (len == 0) ? DefValue + : ((len >= 2 && _totupper((int)LocalBuffer[1]) == 'X') ? _tcstol(LocalBuffer, NULL, 16) + : _tcstol(LocalBuffer, NULL, 10)); +} + +#if defined INI_REAL +/** ini_getf() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue the default value in the event of a failed read + * \param Filename the name of the .ini file to read from + * + * \return the value located at Key + */ +INI_REAL ini_getf(const TCHAR *Section, const TCHAR *Key, INI_REAL DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + int len = ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + return (len == 0) ? DefValue : ini_atof(LocalBuffer); +} +#endif + +/** ini_getbool() + * \param Section the name of the section to search for + * \param Key the name of the entry to find the value of + * \param DefValue default value in the event of a failed read; it should + * zero (0) or one (1). + * \param Filename the name and full path of the .ini file to read from + * + * A true boolean is found if one of the following is matched: + * - A string starting with 'y' or 'Y' + * - A string starting with 't' or 'T' + * - A string starting with '1' + * + * A false boolean is found if one of the following is matched: + * - A string starting with 'n' or 'N' + * - A string starting with 'f' or 'F' + * - A string starting with '0' + * + * \return the true/false flag as interpreted at Key + */ +int ini_getbool(const TCHAR *Section, const TCHAR *Key, int DefValue, const TCHAR *Filename) +{ + TCHAR LocalBuffer[2] = __T(""); + int ret; + + ini_gets(Section, Key, __T(""), LocalBuffer, sizearray(LocalBuffer), Filename); + LocalBuffer[0] = (TCHAR)_totupper((int)LocalBuffer[0]); + if (LocalBuffer[0] == 'Y' || LocalBuffer[0] == '1' || LocalBuffer[0] == 'T') + ret = 1; + else if (LocalBuffer[0] == 'N' || LocalBuffer[0] == '0' || LocalBuffer[0] == 'F') + ret = 0; + else + ret = DefValue; + + return(ret); +} + +/** ini_getsection() + * \param idx the zero-based sequence number of the section to return + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_getsection(int idx, TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || idx < 0) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, NULL, NULL, idx, -1, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } /* if */ + if (!ok) + *Buffer = '\0'; + return (int)_tcslen(Buffer); +} + +/** ini_getkey() + * \param Section the name of the section to browse through, or NULL to + * browse through the keys outside any section + * \param idx the zero-based sequence number of the key to return + * \param Buffer a pointer to the buffer to copy into + * \param BufferSize the maximum number of characters to copy + * \param Filename the name and full path of the .ini file to read from + * + * \return the number of characters copied into the supplied buffer + */ +int ini_getkey(const TCHAR *Section, int idx, TCHAR *Buffer, int BufferSize, const TCHAR *Filename) +{ + INI_FILETYPE fp; + int ok = 0; + + if (Buffer == NULL || BufferSize <= 0 || idx < 0) + return 0; + if (ini_openread(Filename, &fp)) { + ok = getkeystring(&fp, Section, NULL, -1, idx, Buffer, BufferSize, NULL); + (void)ini_close(&fp); + } /* if */ + if (!ok) + *Buffer = '\0'; + return (int)_tcslen(Buffer); +} + + +#if !defined INI_NOBROWSE +/** ini_browse() + * \param Callback a pointer to a function that will be called for every + * setting in the INI file. + * \param UserData arbitrary data, which the function passes on the the + * \c Callback function + * \param Filename the name and full path of the .ini file to read from + * + * \return 1 on success, 0 on failure (INI file not found) + * + * \note The \c Callback function must return 1 to continue + * browsing through the INI file, or 0 to stop. Even when the + * callback stops the browsing, this function will return 1 + * (for success). + */ +int ini_browse(INI_CALLBACK Callback, void *UserData, const TCHAR *Filename) +{ + TCHAR LocalBuffer[INI_BUFFERSIZE]; + int lenSec, lenKey; + enum quote_option quotes; + INI_FILETYPE fp; + + if (Callback == NULL) + return 0; + if (!ini_openread(Filename, &fp)) + return 0; + + LocalBuffer[0] = '\0'; /* copy an empty section in the buffer */ + lenSec = (int)_tcslen(LocalBuffer) + 1; + for ( ;; ) { + TCHAR *sp, *ep; + if (!ini_read(LocalBuffer + lenSec, INI_BUFFERSIZE - lenSec, &fp)) + break; + sp = skipleading(LocalBuffer + lenSec); + /* ignore empty strings and comments */ + if (*sp == '\0' || *sp == ';' || *sp == '#') + continue; + /* see whether we reached a new section */ + ep = _tcsrchr(sp, ']'); + if (*sp == '[' && ep != NULL) { + *ep = '\0'; + ini_strncpy(LocalBuffer, sp + 1, INI_BUFFERSIZE, QUOTE_NONE); + lenSec = (int)_tcslen(LocalBuffer) + 1; + continue; + } /* if */ + /* not a new section, test for a key/value pair */ + ep = _tcschr(sp, '='); /* test for the equal sign or colon */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + if (ep == NULL) + continue; /* invalid line, ignore */ + *ep++ = '\0'; /* split the key from the value */ + striptrailing(sp); + ini_strncpy(LocalBuffer + lenSec, sp, INI_BUFFERSIZE - lenSec, QUOTE_NONE); + lenKey = (int)_tcslen(LocalBuffer + lenSec) + 1; + /* clean up the value */ + sp = skipleading(ep); + sp = cleanstring(sp, "es); /* Remove a trailing comment */ + ini_strncpy(LocalBuffer + lenSec + lenKey, sp, INI_BUFFERSIZE - lenSec - lenKey, quotes); + /* call the callback */ + if (!Callback(LocalBuffer, LocalBuffer + lenSec, LocalBuffer + lenSec + lenKey, UserData)) + break; + } /* for */ + + (void)ini_close(&fp); + return 1; +} +#endif /* INI_NOBROWSE */ + +#if ! defined INI_READONLY +static void ini_tempname(TCHAR *dest, const TCHAR *source, int maxlength) +{ + TCHAR *p; + + ini_strncpy(dest, source, maxlength, QUOTE_NONE); + p = _tcsrchr(dest, '\0'); + assert(p != NULL); + *(p - 1) = '~'; +} + +static enum quote_option check_enquote(const TCHAR *Value) +{ + const TCHAR *p; + + /* run through the value, if it has trailing spaces, or '"', ';' or '#' + * characters, enquote it + */ + assert(Value != NULL); + for (p = Value; *p != '\0' && *p != '"' && *p != ';' && *p != '#'; p++) + /* nothing */; + return (*p != '\0' || (p > Value && *(p - 1) == ' ')) ? QUOTE_ENQUOTE : QUOTE_NONE; +} + +static void writesection(TCHAR *LocalBuffer, const TCHAR *Section, INI_FILETYPE *fp) +{ + if (Section != NULL && _tcslen(Section) > 0) { + TCHAR *p; + LocalBuffer[0] = '['; + ini_strncpy(LocalBuffer + 1, Section, INI_BUFFERSIZE - 4, QUOTE_NONE); /* -1 for '[', -1 for ']', -2 for '\r\n' */ + p = _tcsrchr(LocalBuffer, '\0'); + assert(p != NULL); + *p++ = ']'; + _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ + if (fp != NULL) + (void)ini_write(LocalBuffer, fp); + } /* if */ +} + +static void writekey(TCHAR *LocalBuffer, const TCHAR *Key, const TCHAR *Value, INI_FILETYPE *fp) +{ + TCHAR *p; + enum quote_option option = check_enquote(Value); + ini_strncpy(LocalBuffer, Key, INI_BUFFERSIZE - 3, QUOTE_NONE); /* -1 for '=', -2 for '\r\n' */ + p = _tcsrchr(LocalBuffer, '\0'); + assert(p != NULL); + *p++ = '='; + ini_strncpy(p, Value, INI_BUFFERSIZE - (p - LocalBuffer) - 2, option); /* -2 for '\r\n' */ + p = _tcsrchr(LocalBuffer, '\0'); + assert(p != NULL); + _tcscpy(p, INI_LINETERM); /* copy line terminator (typically "\n") */ + if (fp != NULL) + (void)ini_write(LocalBuffer, fp); +} + +static int cache_accum(const TCHAR *string, int *size, int max) +{ + int len = (int)_tcslen(string); + if (*size + len >= max) + return 0; + *size += len; + return 1; +} + +static int cache_flush(TCHAR *buffer, int *size, + INI_FILETYPE *rfp, INI_FILETYPE *wfp, INI_FILEPOS *mark) +{ + int terminator_len = (int)_tcslen(INI_LINETERM); + int pos = 0; + + (void)ini_seek(rfp, mark); + assert(buffer != NULL); + buffer[0] = '\0'; + assert(size != NULL); + assert(*size <= INI_BUFFERSIZE); + while (pos < *size) { + (void)ini_read(buffer + pos, INI_BUFFERSIZE - pos, rfp); + while (pos < *size && buffer[pos] != '\0') + pos++; /* cannot use _tcslen() because buffer may not be zero-terminated */ + } /* while */ + if (buffer[0] != '\0') { + assert(pos > 0 && pos <= INI_BUFFERSIZE); + if (pos == INI_BUFFERSIZE) + pos--; + buffer[pos] = '\0'; /* force zero-termination (may be left unterminated in the above while loop) */ + (void)ini_write(buffer, wfp); + } + ini_tell(rfp, mark); /* update mark */ + *size = 0; + /* return whether the buffer ended with a line termination */ + return (pos > terminator_len) && (_tcscmp(buffer + pos - terminator_len, INI_LINETERM) == 0); +} + +static int close_rename(INI_FILETYPE *rfp, INI_FILETYPE *wfp, const TCHAR *filename, TCHAR *buffer) +{ + (void)ini_close(rfp); + (void)ini_close(wfp); + (void)ini_remove(filename); + (void)ini_tempname(buffer, filename, INI_BUFFERSIZE); + (void)ini_rename(buffer, filename); + return 1; +} + +/** ini_puts() + * \param Section the name of the section to write the string in + * \param Key the name of the entry to write, or NULL to erase all keys in the section + * \param Value a pointer to the buffer the string, or NULL to erase the key + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_puts(const TCHAR *Section, const TCHAR *Key, const TCHAR *Value, const TCHAR *Filename) +{ + INI_FILETYPE rfp; + INI_FILETYPE wfp; + INI_FILEPOS mark; + INI_FILEPOS head, tail; + TCHAR *sp, *ep; + TCHAR LocalBuffer[INI_BUFFERSIZE]; + int len, match, flag, cachelen; + + assert(Filename != NULL); + if (!ini_openread(Filename, &rfp)) { + /* If the .ini file doesn't exist, make a new file */ + if (Key != NULL && Value != NULL) { + if (!ini_openwrite(Filename, &wfp)) + return 0; + writesection(LocalBuffer, Section, &wfp); + writekey(LocalBuffer, Key, Value, &wfp); + (void)ini_close(&wfp); + } /* if */ + return 1; + } /* if */ + + /* If parameters Key and Value are valid (so this is not an "erase" request) + * and the setting already exists, there are two short-cuts to avoid rewriting + * the INI file. + */ + if (Key != NULL && Value != NULL) { + ini_tell(&rfp, &mark); + match = getkeystring(&rfp, Section, Key, -1, -1, LocalBuffer, sizearray(LocalBuffer), &head); + if (match) { + /* if the current setting is identical to the one to write, there is + * nothing to do. + */ + if (_tcscmp(LocalBuffer,Value) == 0) { + (void)ini_close(&rfp); + return 1; + } /* if */ + /* if the new setting has the same length as the current setting, and the + * glue file permits file read/write access, we can modify in place. + */ + #if defined ini_openrewrite + /* we already have the start of the (raw) line, get the end too */ + ini_tell(&rfp, &tail); + /* create new buffer (without writing it to file) */ + writekey(LocalBuffer, Key, Value, NULL); + if (_tcslen(LocalBuffer) == (size_t)(tail - head)) { + /* length matches, close the file & re-open for read/write, then + * write at the correct position + */ + (void)ini_close(&rfp); + if (!ini_openrewrite(Filename, &wfp)) + return 0; + (void)ini_seek(&wfp, &head); + (void)ini_write(LocalBuffer, &wfp); + (void)ini_close(&wfp); + return 1; + } /* if */ + #endif + } /* if */ + /* key not found, or different value & length -> proceed (but rewind the + * input file first) + */ + (void)ini_seek(&rfp, &mark); + } /* if */ + + /* Get a temporary file name to copy to. Use the existing name, but with + * the last character set to a '~'. + */ + ini_tempname(LocalBuffer, Filename, INI_BUFFERSIZE); + if (!ini_openwrite(LocalBuffer, &wfp)) { + (void)ini_close(&rfp); + return 0; + } /* if */ + (void)ini_tell(&rfp, &mark); + cachelen = 0; + + /* Move through the file one line at a time until a section is + * matched or until EOF. Copy to temp file as it is read. + */ + len = (Section != NULL) ? (int)_tcslen(Section) : 0; + if (len > 0) { + do { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + /* Failed to find section, so add one to the end */ + flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key!=NULL && Value!=NULL) { + if (!flag) + (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ + writesection(LocalBuffer, Section, &wfp); + writekey(LocalBuffer, Key, Value, &wfp); + } /* if */ + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ + } /* if */ + /* Copy the line from source to dest, but not if this is the section that + * we are looking for and this section must be removed + */ + sp = skipleading(LocalBuffer); + ep = _tcsrchr(sp, ']'); + match = (*sp == '[' && ep != NULL && (int)(ep-sp-1) == len && _tcsnicmp(sp + 1,Section,len) == 0); + if (!match || Key != NULL) { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } /* if */ + } /* if */ + } while (!match); + } /* if */ + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + /* when deleting a section, the section head that was just found has not been + * copied to the output file, but because this line was not "accumulated" in + * the cache, the position in the input file was reset to the point just + * before the section; this must now be skipped (again) + */ + if (Key == NULL) { + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + (void)ini_tell(&rfp, &mark); + } /* if */ + + /* Now that the section has been found, find the entry. Stop searching + * upon leaving the section's area. Copy the file as it is read + * and create an entry if one is not found. + */ + len = (Key != NULL) ? (int)_tcslen(Key) : 0; + for( ;; ) { + if (!ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + /* EOF without an entry so make one */ + flag = cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key!=NULL && Value!=NULL) { + if (!flag) + (void)ini_write(INI_LINETERM, &wfp); /* force a new line behind the last line of the INI file */ + writekey(LocalBuffer, Key, Value, &wfp); + } /* if */ + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ + } /* if */ + sp = skipleading(LocalBuffer); + ep = _tcschr(sp, '='); /* Parse out the equal sign */ + if (ep == NULL) + ep = _tcschr(sp, ':'); + match = (ep != NULL && len > 0 && (int)(skiptrailing(ep,sp)-sp) == len && _tcsnicmp(sp,Key,len) == 0); + if ((Key != NULL && match) || *sp == '[') + break; /* found the key, or found a new section */ + /* copy other keys in the section */ + if (Key == NULL) { + (void)ini_tell(&rfp, &mark); /* we are deleting the entire section, so update the read position */ + } else { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } /* if */ + } /* if */ + } /* for */ + /* the key was found, or we just dropped on the next section (meaning that it + * wasn't found); in both cases we need to write the key, but in the latter + * case, we also need to write the line starting the new section after writing + * the key + */ + flag = (*sp == '['); + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + if (Key != NULL && Value != NULL) + writekey(LocalBuffer, Key, Value, &wfp); + /* cache_flush() reset the "read pointer" to the start of the line with the + * previous key or the new section; read it again (because writekey() destroyed + * the buffer) + */ + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + if (flag) { + /* the new section heading needs to be copied to the output file */ + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } else { + /* forget the old key line */ + (void)ini_tell(&rfp, &mark); + } /* if */ + /* Copy the rest of the INI file */ + while (ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp)) { + if (!cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE)) { + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + (void)ini_read(LocalBuffer, INI_BUFFERSIZE, &rfp); + cache_accum(LocalBuffer, &cachelen, INI_BUFFERSIZE); + } /* if */ + } /* while */ + cache_flush(LocalBuffer, &cachelen, &rfp, &wfp, &mark); + return close_rename(&rfp, &wfp, Filename, LocalBuffer); /* clean up and rename */ +} + +/* Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C" book. */ +#define ABS(v) ((v) < 0 ? -(v) : (v)) + +static void strreverse(TCHAR *str) +{ + int i, j; + for (i = 0, j = (int)_tcslen(str) - 1; i < j; i++, j--) { + TCHAR t = str[i]; + str[i] = str[j]; + str[j] = t; + } /* for */ +} + +static void long2str(long value, TCHAR *str) +{ + int i = 0; + long sign = value; + + /* generate digits in reverse order */ + do { + int n = (int)(value % 10); /* get next lowest digit */ + str[i++] = (TCHAR)(ABS(n) + '0'); /* handle case of negative digit */ + } while (value /= 10); /* delete the lowest digit */ + if (sign < 0) + str[i++] = '-'; + str[i] = '\0'; + + strreverse(str); +} + +/** ini_putl() + * \param Section the name of the section to write the value in + * \param Key the name of the entry to write + * \param Value the value to write + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_putl(const TCHAR *Section, const TCHAR *Key, long Value, const TCHAR *Filename) +{ + TCHAR LocalBuffer[32]; + long2str(Value, LocalBuffer); + return ini_puts(Section, Key, LocalBuffer, Filename); +} + +#if defined INI_REAL +/** ini_putf() + * \param Section the name of the section to write the value in + * \param Key the name of the entry to write + * \param Value the value to write + * \param Filename the name and full path of the .ini file to write to + * + * \return 1 if successful, otherwise 0 + */ +int ini_putf(const TCHAR *Section, const TCHAR *Key, INI_REAL Value, const TCHAR *Filename) +{ + TCHAR LocalBuffer[64]; + ini_ftoa(LocalBuffer, Value); + return ini_puts(Section, Key, LocalBuffer, Filename); +} +#endif /* INI_REAL */ +#endif /* !INI_READONLY */ diff --git a/minIni/minIni.h b/minIni/minIni.h new file mode 100644 index 0000000..41a8044 --- /dev/null +++ b/minIni/minIni.h @@ -0,0 +1,152 @@ +/* minIni - Multi-Platform INI file parser, suitable for embedded systems + * + * Copyright (c) CompuPhase, 2008-2017 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Version: $Id: minIni.h 53 2015-01-18 13:35:11Z thiadmer.riemersma@gmail.com $ + */ +#ifndef MININI_H +#define MININI_H + +#include "minGlue.h" + +#if (defined _UNICODE || defined __UNICODE__ || defined UNICODE) && !defined INI_ANSIONLY + #include + #define mTCHAR TCHAR +#else + /* force TCHAR to be "char", but only for minIni */ + #define mTCHAR char +#endif + +#if !defined INI_BUFFERSIZE + #define INI_BUFFERSIZE 512 +#endif + +#if defined __cplusplus + extern "C" { +#endif + +int ini_getbool(const mTCHAR *Section, const mTCHAR *Key, int DefValue, const mTCHAR *Filename); +long ini_getl(const mTCHAR *Section, const mTCHAR *Key, long DefValue, const mTCHAR *Filename); +int ini_gets(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *DefValue, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); +int ini_getsection(int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); +int ini_getkey(const mTCHAR *Section, int idx, mTCHAR *Buffer, int BufferSize, const mTCHAR *Filename); + +#if defined INI_REAL +INI_REAL ini_getf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL DefValue, const mTCHAR *Filename); +#endif + +#if !defined INI_READONLY +int ini_putl(const mTCHAR *Section, const mTCHAR *Key, long Value, const mTCHAR *Filename); +int ini_puts(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, const mTCHAR *Filename); +#if defined INI_REAL +int ini_putf(const mTCHAR *Section, const mTCHAR *Key, INI_REAL Value, const mTCHAR *Filename); +#endif +#endif /* INI_READONLY */ + +#if !defined INI_NOBROWSE +typedef int (*INI_CALLBACK)(const mTCHAR *Section, const mTCHAR *Key, const mTCHAR *Value, void *UserData); +int ini_browse(INI_CALLBACK Callback, void *UserData, const mTCHAR *Filename); +#endif /* INI_NOBROWSE */ + +#if defined __cplusplus + } +#endif + + +#if defined __cplusplus + +#if defined __WXWINDOWS__ + #include "wxMinIni.h" +#else + #include + + /* The C++ class in minIni.h was contributed by Steven Van Ingelgem. */ + class minIni + { + public: + minIni(const std::string& filename) : iniFilename(filename) + { } + + bool getbool(const std::string& Section, const std::string& Key, bool DefValue=false) const + { return ini_getbool(Section.c_str(), Key.c_str(), int(DefValue), iniFilename.c_str()) != 0; } + + long getl(const std::string& Section, const std::string& Key, long DefValue=0) const + { return ini_getl(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } + + int geti(const std::string& Section, const std::string& Key, int DefValue=0) const + { return static_cast(this->getl(Section, Key, long(DefValue))); } + + std::string gets(const std::string& Section, const std::string& Key, const std::string& DefValue="") const + { + char buffer[INI_BUFFERSIZE]; + ini_gets(Section.c_str(), Key.c_str(), DefValue.c_str(), buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + + std::string getsection(int idx) const + { + char buffer[INI_BUFFERSIZE]; + ini_getsection(idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + + std::string getkey(const std::string& Section, int idx) const + { + char buffer[INI_BUFFERSIZE]; + ini_getkey(Section.c_str(), idx, buffer, INI_BUFFERSIZE, iniFilename.c_str()); + return buffer; + } + +#if defined INI_REAL + INI_REAL getf(const std::string& Section, const std::string& Key, INI_REAL DefValue=0) const + { return ini_getf(Section.c_str(), Key.c_str(), DefValue, iniFilename.c_str()); } +#endif + +#if ! defined INI_READONLY + bool put(const std::string& Section, const std::string& Key, long Value) const + { return ini_putl(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, int Value) const + { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, bool Value) const + { return ini_putl(Section.c_str(), Key.c_str(), (long)Value, iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, const std::string& Value) const + { return ini_puts(Section.c_str(), Key.c_str(), Value.c_str(), iniFilename.c_str()) != 0; } + + bool put(const std::string& Section, const std::string& Key, const char* Value) const + { return ini_puts(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } + +#if defined INI_REAL + bool put(const std::string& Section, const std::string& Key, INI_REAL Value) const + { return ini_putf(Section.c_str(), Key.c_str(), Value, iniFilename.c_str()) != 0; } +#endif + + bool del(const std::string& Section, const std::string& Key) const + { return ini_puts(Section.c_str(), Key.c_str(), 0, iniFilename.c_str()) != 0; } + + bool del(const std::string& Section) const + { return ini_puts(Section.c_str(), 0, 0, iniFilename.c_str()) != 0; } +#endif + + private: + std::string iniFilename; + }; + +#endif /* __WXWINDOWS__ */ +#endif /* __cplusplus */ + +#endif /* MININI_H */ diff --git a/release/install.sh b/release/install.sh new file mode 100755 index 0000000..0160be7 --- /dev/null +++ b/release/install.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# +# ROOT=/nas/data/Development/Raspberry/gpiocrtl/test-install +# + + +BUILD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +SERVICE="sprinklerd" + +BIN="sprinklerd" +CFG="sprinklerd.conf" +SRV="sprinklerd.service" +DEF="sprinklerd" +MDNS="sprinklerd.service" + +BINLocation="/usr/local/bin" +CFGLocation="/etc" +SRVLocation="/etc/systemd/system" +DEFLocation="/etc/default" +WEBLocation="/var/www/sprinklerd/" +MDNSLocation="/etc/avahi/services/" + +if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root" + exit 1 +fi + +if [[ $(mount | grep " / " | grep "(ro,") ]]; then + echo "Root filesystem is readonly, can't install" + exit 1 +fi + +# Check cron.d options +if [ ! -d "/etc/cron.d" ]; then + echo "The version of Cron may not support chron.d, if so the calendar will not work" + echo "Please check before starting" +else + if [ -f "/etc/default/cron" ]; then + CD=$(cat /etc/default/cron | grep -v ^# | grep "\-l") + if [ -z "$CD" ]; then + echo "Please enabled cron.d support, if not the calendar will not work" + echo "Edit /etc/default/cron and look for the -l option" + fi + else + echo "Please make sure the version if Cron supports chron.d, if not the calendar will not work" + fi +fi + +# Exit if we can't find systemctl +command -v systemctl >/dev/null 2>&1 || { echo "This script needs systemd's systemctl manager, Please check path or install manually" >&2; exit 1; } + +# stop service, hide any error, as the service may not be installed yet +systemctl stop $SERVICE > /dev/null 2>&1 +SERVICE_EXISTS=$(echo $?) + +# copy files to locations, but only copy cfg if it doesn;t already exist + +cp $BUILD/$BIN $BINLocation/$BIN +cp $BUILD/$SRV $SRVLocation/$SRV + +if [ -f $CFGLocation/$CFG ]; then + echo "Config exists, did not copy new config, you may need to edit existing! $CFGLocation/$CFG" +else + cp $BUILD/$CFG $CFGLocation/$CFG +fi + +if [ -f $DEFLocation/$DEF ]; then + echo "Defaults exists, did not copy new defaults to $DEFLocation/$DEF" +else + cp $BUILD/$DEF.defaults $DEFLocation/$DEF +fi + +if [ -f $MDNSLocation/$MDNS ]; then + echo "Avahi/mDNS defaults exists, did not copy new defaults to $MDNSLocation/$MDNS" +else + if [ -d "$MDNSLocation" ]; then + cp $BUILD/$MDNS.avahi $MDNSLocation/$MDNS + else + echo "Avahi/mDNS may not be installed, not copying $MDNSLocation/$MDNS" + fi +fi + +if [ ! -d "$WEBLocation" ]; then + mkdir -p $WEBLocation +fi + +cp -r $BUILD/../web/* $WEBLocation + +systemctl enable $SERVICE +systemctl daemon-reload + +if [ $SERVICE_EXISTS -eq 0 ]; then + echo "Starting daemon $SERVICE" + systemctl start $SERVICE +fi + diff --git a/release/sprinklerd b/release/sprinklerd new file mode 100755 index 0000000000000000000000000000000000000000..5c763c6ef0b3b7ff19299350465fd344d7235798 GIT binary patch literal 206344 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 + + +%h HTTP + +_http._tcp +80 + + \ No newline at end of file diff --git a/sprinkler.cron b/sprinkler.cron new file mode 100644 index 0000000..f65603c --- /dev/null +++ b/sprinkler.cron @@ -0,0 +1,5 @@ +00 08 * * 1 /usr/bin/curl 'localhost?type=cron&zone=1&runtime=12' +12 08 * * 1 /usr/bin/curl 'localhost?type=cron&zone=2&runtime=10' +22 08 * * 1 /usr/bin/curl 'localhost?type=cron&zone=3&runtime=8' +00 08 * * 2 /usr/bin/curl 'localhost?type=cron&zone=1&runtime=8' +00 22 * * 3 /usr/bin/curl 'localhost?type=cron&zone=2&runtime=10' diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..5999935 --- /dev/null +++ b/web/index.html @@ -0,0 +1,448 @@ + + + + + + Sprinkler + + + + + + + + + +
+
+ Loading.... +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ Run on calendar schedule + +
+ + +
+
+ 24h Rain Delay  + +
+ + +
+
+ Run now option +
Cycle all Zones +
+ + +
+
+
+
+ + + + +
+
+ + \ No newline at end of file