more helper functions added to nxinstall
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 5 Nov 2011 09:36:09 +0000 (09:36 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 5 Nov 2011 09:36:09 +0000 (09:36 +0000)
doc/internal/nxinstall.txt [new file with mode: 0644]
src/nxinstall/env.cpp
src/nxinstall/file.cpp [new file with mode: 0644]
src/nxinstall/io.cpp
src/nxinstall/nxinstall.h
src/nxinstall/nxinstall.vcproj
src/nxinstall/system.cpp [copied from src/nxinstall/env.cpp with 55% similarity]

diff --git a/doc/internal/nxinstall.txt b/doc/internal/nxinstall.txt
new file mode 100644 (file)
index 0000000..7670402
--- /dev/null
@@ -0,0 +1,102 @@
+************
+* Tracing
+
+"trace" function can be used in nxinstall scripts, output will be sent to stdout.
+Trace level can be set by -t command line option. Default is 0.
+
+
+*****************************
+* Additional NXSL functions
+
+1. access(file, mode)
+
+Returns 1 (true) if file is accessible
+
+
+2. chdir(path)
+
+Change current directory.
+
+
+3. CopyFile(src,dst)
+
+Copy file. Currently available only on Windows.
+
+
+4. DeleteFile(name)
+
+Delete file (calls remove(name))
+
+
+5. fclose(handle)
+
+Close file.
+
+
+6. feof(handle)
+
+Returns 1 (true) if eof reached.
+
+
+7. fgets(handle)
+
+Read next line from file. String returned with new line character removed.
+Returns null if EOF reached and no characters was read.
+
+
+8. fopen(name, mode)
+
+Open file. Returns file handle (object of class FILE). Handle has one attribute
+"eof", which can be used for end of file checking. Mode is the same as for
+libc call.
+
+
+9. fputs(handle, string)
+
+Writes line to file. New line character appended automatically.
+
+
+10. mkdir(name)
+
+Create directory (calls libc mkdir).
+
+
+11. RenameFile(oldName, newName)
+
+Rename file or directory (calls libc rename).
+
+
+12. rmdir(name)
+
+Remove directory (calls libc rmdir).
+
+
+13. system(command)
+
+Executes external command by calling libc system.
+
+
+
+******************
+* Script example
+
+mkdir("inst");
+chdir("inst");
+
+f = fopen("test","w");
+fputs(f, "line 1");
+fputs(f, "line 2");
+fclose(f);
+
+f = fopen("test");
+while(!f->eof)
+{
+   s = fgets(f);
+   if (s != null)
+      trace(0, ">>> " . s);
+}
+fclose(f);
+
+chdir("..");
+
+system("pwd");
index 31792c3..b9911f1 100644 (file)
 static NXSL_ExtFunction s_nxslInstallerFunctions[] =
 {
    { _T("access"), F_access, 2 },
+   { _T("chdir"), F_chdir, 1 },
+       { _T("CopyFile"), F_CopyFile, 2 },
+       { _T("DeleteFile"), F_DeleteFile, 1 },
    { _T("fclose"), F_fclose, 1 },
    { _T("feof"), F_feof, 1 },
    { _T("fgets"), F_fgets, 1 },
    { _T("fopen"), F_fopen, -1 },
-   { _T("fputs"), F_fputs, 2 }
+   { _T("fputs"), F_fputs, 2 },
+   { _T("mkdir"), F_mkdir, 1 },
+       { _T("RenameFile"), F_RenameFile, 2 },
+   { _T("rmdir"), F_rmdir, 1 },
+   { _T("system"), F_system, 1 }
 };
 
 /**
diff --git a/src/nxinstall/file.cpp b/src/nxinstall/file.cpp
new file mode 100644 (file)
index 0000000..fbba3da
--- /dev/null
@@ -0,0 +1,125 @@
+/* 
+** NetXMS - Network Management System
+** NXSL-based installer tool collection
+** Copyright (C) 2005-2011 Victor Kirhenshtein
+**
+** 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 2 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, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** File: file.cpp
+**
+**/
+
+#include "nxinstall.h"
+
+
+/**
+ * Check file access.
+ * Parameters:
+ *   1) file name
+ *   2) desired access
+ */
+int F_access(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       if (!argv[1]->isInteger())
+               return NXSL_ERR_NOT_INTEGER;
+
+       *ppResult = new NXSL_Value((LONG)((_taccess(argv[0]->getValueAsCString(), argv[1]->getValueAsInt32()) == 0) ? 1 : 0));
+       return 0;
+}
+
+/**
+ * Copy file
+ * Parameters:
+ *   1) source file name
+ *   2) destination file name
+ */
+int F_CopyFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       if (!argv[1]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+#ifdef _WIN32
+       *ppResult = new NXSL_Value((LONG)CopyFile(argv[0]->getValueAsCString(), argv[1]->getValueAsCString(), FALSE));
+#else
+       *ppResult = new NXSL_Value;     /* TODO: implement file copy on UNIX */
+#endif
+       return 0;
+}
+
+/**
+ * Rename file or directory
+ * Parameters:
+ *   1) old file name
+ *   2) new file name
+ */
+int F_RenameFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       if (!argv[1]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       *ppResult = new NXSL_Value((LONG)_trename(argv[0]->getValueAsCString(), argv[1]->getValueAsCString()));
+       return 0;
+}
+
+/**
+ * Delete file.
+ * Parameters:
+ *   1) file name
+ */
+int F_DeleteFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       *ppResult = new NXSL_Value((LONG)((_tremove(argv[0]->getValueAsCString()) == 0) ? 1 : 0));
+       return 0;
+}
+
+/**
+ * Create directory
+ * Parameters:
+ *   1) directory name
+ */
+int F_mkdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       *ppResult = new NXSL_Value((LONG)_tmkdir(argv[0]->getValueAsCString()));
+       return 0;
+}
+
+/**
+ * Remove directory
+ * Parameters:
+ *   1) directory name
+ */
+int F_rmdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
+{
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       *ppResult = new NXSL_Value((LONG)_trmdir(argv[0]->getValueAsCString()));
+       return 0;
+}
index d3fee09..18cc3d8 100644 (file)
@@ -42,24 +42,6 @@ NXSL_Value *NXSL_FileClass::getAttr(NXSL_Object *pObject, const TCHAR *pszAttr)
 }
 
 /**
- * Check file access.
- * Parameters:
- *   1) file name
- *   2) desired access
- */
-int F_access(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
-{
-       if (!argv[0]->isString())
-               return NXSL_ERR_NOT_STRING;
-
-       if (!argv[1]->isInteger())
-               return NXSL_ERR_NOT_INTEGER;
-
-       *ppResult = new NXSL_Value((LONG)((_taccess(argv[0]->getValueAsCString(), argv[1]->getValueAsInt32()) == 0) ? 1 : 0));
-       return 0;
-}
-
-/**
  * Open file. Returns FILE object or null.
  * Parameters:
  *   1) file name
index 0a9d884..6f250e1 100644 (file)
@@ -58,11 +58,18 @@ public:
  * NXSL external functions
  */
 int F_access(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_chdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_CopyFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_DeleteFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_fopen(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_fclose(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_feof(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_fgets(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 int F_fputs(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_mkdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_RenameFile(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_rmdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
+int F_system(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program);
 
 /**
  * Global variables
index 94d2890..de16ac0 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\file.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\io.cpp"\r
                                >\r
                        </File>\r
                                RelativePath=".\nxinstall.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath=".\system.cpp"\r
+                               >\r
+                       </File>\r
                </Filter>\r
                <Filter\r
                        Name="Header Files"\r
similarity index 55%
copy from src/nxinstall/env.cpp
copy to src/nxinstall/system.cpp
index 31792c3..790d36a 100644 (file)
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** File: env.cpp
+** File: system.cpp
 **
 **/
 
 #include "nxinstall.h"
 
-
 /**
- * Additional NXSL functions
+ * Change current directory
+ * Parameters:
+ *   1) path
  */
-static NXSL_ExtFunction s_nxslInstallerFunctions[] =
+int F_chdir(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
 {
-   { _T("access"), F_access, 2 },
-   { _T("fclose"), F_fclose, 1 },
-   { _T("feof"), F_feof, 1 },
-   { _T("fgets"), F_fgets, 1 },
-   { _T("fopen"), F_fopen, -1 },
-   { _T("fputs"), F_fputs, 2 }
-};
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
 
-/**
- * Constructor for installer script environment
- */
-NXSL_InstallerEnvironment::NXSL_InstallerEnvironment() : NXSL_Environment()
-{
-       setIO(stdin, stdout);
-       registerFunctionSet(sizeof(s_nxslInstallerFunctions) / sizeof(NXSL_ExtFunction), s_nxslInstallerFunctions);
+       *ppResult = new NXSL_Value((LONG)_tchdir(argv[0]->getValueAsCString()));
+       return 0;
 }
 
 /**
- * Script trace output
+ * Execute command in a shell.
+ * Parameters:
+ *   1) command
  */
-void NXSL_InstallerEnvironment::trace(int level, const TCHAR *text)
+int F_system(int argc, NXSL_Value **argv, NXSL_Value **ppResult, NXSL_Program *program)
 {
-       if (level <= g_traceLevel)
-       {
-               _tprintf(_T("%s\n"), text);
-       }
+       if (!argv[0]->isString())
+               return NXSL_ERR_NOT_STRING;
+
+       *ppResult = new NXSL_Value((LONG)_tsystem(argv[0]->getValueAsCString()));
+       return 0;
 }