The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.
This URL has Read-Only access.
root / trunk / DomotiGa / Shell.module @ 875
History | View | Annotate | Download (4.1 kB)
| 1 | 693 | rdnzl | ' Gambas module file |
|---|---|---|---|
| 2 | 693 | rdnzl | |
| 3 | 693 | rdnzl | ' Description: |
| 4 | 693 | rdnzl | ' Execute.module |
| 5 | 693 | rdnzl | ' Support for getting shell script output in device values. |
| 6 | 693 | rdnzl | |
| 7 | 693 | rdnzl | ' Development Status: |
| 8 | 693 | rdnzl | ' Just started. |
| 9 | 693 | rdnzl | |
| 10 | 693 | rdnzl | ' DomotiGa - an open source home automation program. |
| 11 | 693 | rdnzl | ' Copyright(C) 2008-2011 Ron Klinkien |
| 12 | 693 | rdnzl | |
| 13 | 693 | rdnzl | ' Read file called COPYING for license details. |
| 14 | 693 | rdnzl | |
| 15 | 693 | rdnzl | PUBLIC tShell AS Timer |
| 16 | 693 | rdnzl | PRIVATE hShell AS Process |
| 17 | 693 | rdnzl | PRIVATE cOutput AS NEW Collection |
| 18 | 693 | rdnzl | |
| 19 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 20 | 693 | rdnzl | ' start timer |
| 21 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 22 | 693 | rdnzl | PUBLIC SUB Run() |
| 23 | 693 | rdnzl | |
| 24 | 693 | rdnzl | ' start poll timer for Shell |
| 25 | 693 | rdnzl | tShell = NEW Timer AS "tShell" |
| 26 | 693 | rdnzl | tShell.Delay = Main.iShellPollTime * 1000 ' multiply for seconds |
| 27 | 693 | rdnzl | tShell.Start |
| 28 | 693 | rdnzl | |
| 29 | 693 | rdnzl | END |
| 30 | 693 | rdnzl | |
| 31 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 32 | 693 | rdnzl | ' gets called at each timer event |
| 33 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 34 | 693 | rdnzl | PUBLIC SUB tShell_Timer() |
| 35 | 693 | rdnzl | |
| 36 | 693 | rdnzl | CheckShell() |
| 37 | 693 | rdnzl | |
| 38 | 693 | rdnzl | END |
| 39 | 693 | rdnzl | |
| 40 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 41 | 693 | rdnzl | ' find all devices of type Shell and run command to get value(s) |
| 42 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 43 | 693 | rdnzl | PRIVATE SUB CheckShell() |
| 44 | 693 | rdnzl | |
| 45 | 693 | rdnzl | DIM rResult AS Result |
| 46 | 693 | rdnzl | DIM iInterface AS Integer |
| 47 | 693 | rdnzl | |
| 48 | 693 | rdnzl | ' get all devices with this devicetype |
| 49 | 693 | rdnzl | rResult = Main.hDB.Exec("SELECT * FROM devices WHERE interface = &1 AND enabled is TRUE", Devices.FindInterface("Shell Interface"))
|
| 50 | 693 | rdnzl | IF rResult.Available THEN |
| 51 | 693 | rdnzl | IF rResult.Count >= 1 THEN |
| 52 | 693 | rdnzl | FOR EACH rResult |
| 53 | 693 | rdnzl | IF Main.bShellDebug THEN Main.WriteDebugLog(("[Shell] Getting value(s) for device '") & rResult!name & ("' with command '") & rResult!address & "'.")
|
| 54 | 693 | rdnzl | RunShellCommand(rResult!id, rResult!address) |
| 55 | 693 | rdnzl | NEXT |
| 56 | 693 | rdnzl | ELSE |
| 57 | 693 | rdnzl | Main.WriteLog(("Shell: No devices of type shell script found in device table!"))
|
| 58 | 693 | rdnzl | ENDIF |
| 59 | 693 | rdnzl | ENDIF |
| 60 | 693 | rdnzl | |
| 61 | 693 | rdnzl | END |
| 62 | 693 | rdnzl | |
| 63 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 64 | 693 | rdnzl | ' run command to get value(s) |
| 65 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 66 | 693 | rdnzl | PRIVATE SUB RunShellCommand(iId AS Integer, sAddress AS String) |
| 67 | 693 | rdnzl | |
| 68 | 693 | rdnzl | hShell = EXEC [sAddress] FOR READ AS "Shell" |
| 69 | 693 | rdnzl | hShell.Tag = iId |
| 70 | 693 | rdnzl | cOutput.Add("", iId)
|
| 71 | 693 | rdnzl | |
| 72 | 693 | rdnzl | END |
| 73 | 693 | rdnzl | |
| 74 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 75 | 693 | rdnzl | ' read command output and store it in collection |
| 76 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 77 | 693 | rdnzl | PUBLIC SUB Shell_Read() |
| 78 | 693 | rdnzl | |
| 79 | 693 | rdnzl | DIM sBuffer AS String |
| 80 | 693 | rdnzl | DIM iId AS Integer |
| 81 | 693 | rdnzl | |
| 82 | 693 | rdnzl | READ #LAST, sBuffer, -256 |
| 83 | 693 | rdnzl | iId = LAST.Tag |
| 84 | 693 | rdnzl | |
| 85 | 693 | rdnzl | IF cOutput.Exist(iId) THEN cOutput[iId] &= sBuffer |
| 86 | 693 | rdnzl | |
| 87 | 693 | rdnzl | END |
| 88 | 693 | rdnzl | |
| 89 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 90 | 693 | rdnzl | ' get id and returned value(s) and store them |
| 91 | 693 | rdnzl | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 92 | 693 | rdnzl | PUBLIC SUB Shell_Kill() |
| 93 | 693 | rdnzl | |
| 94 | 797 | rdnzl | DIM iDeviceId, iRc, iCnt AS Integer |
| 95 | 693 | rdnzl | DIM sOutput, sLine, sValue, sValue2, sValue3, sValue4 AS String |
| 96 | 693 | rdnzl | |
| 97 | 797 | rdnzl | iDeviceId = LAST.Tag |
| 98 | 693 | rdnzl | iRc = LAST.Value |
| 99 | 693 | rdnzl | |
| 100 | 797 | rdnzl | IF iDeviceId THEN |
| 101 | 797 | rdnzl | ' save shell output |
| 102 | 797 | rdnzl | sOutput = cOutput[iDeviceId] |
| 103 | 797 | rdnzl | cOutput.Remove(iDeviceId) |
| 104 | 693 | rdnzl | |
| 105 | 797 | rdnzl | SELECT iRC |
| 106 | 797 | rdnzl | CASE 0 |
| 107 | 797 | rdnzl | FOR EACH sLine IN Split(sOutput, "\n") |
| 108 | 797 | rdnzl | SELECT iCnt |
| 109 | 797 | rdnzl | CASE 0 |
| 110 | 797 | rdnzl | sValue = sLine |
| 111 | 797 | rdnzl | CASE 1 |
| 112 | 797 | rdnzl | sValue2 = sLine |
| 113 | 797 | rdnzl | CASE 2 |
| 114 | 797 | rdnzl | sValue3 = sLine |
| 115 | 797 | rdnzl | CASE 3 |
| 116 | 797 | rdnzl | sValue4 = sLine |
| 117 | 797 | rdnzl | END SELECT |
| 118 | 797 | rdnzl | INC iCnt |
| 119 | 797 | rdnzl | NEXT |
| 120 | 797 | rdnzl | ' debug output |
| 121 | 797 | rdnzl | IF Main.bShellDebug THEN |
| 122 | 797 | rdnzl | Main.WriteDebugLog("[Shell] < '" & sOutput)
|
| 123 | 797 | rdnzl | Main.WriteDebugLog(("[Shell] Device with id '") & iDeviceId & ("' returned value(s)") & IIf(sValue, " '" & sValue & "'", "") & IIf(sValue2, " '" & sValue2 & "'", "") & IIf(sValue3, " '" & sValue3 & "'", "") & IIf(sValue4, " '" & sValue4 & "'", "") & ".")
|
| 124 | 797 | rdnzl | ENDIF |
| 125 | 797 | rdnzl | ' find and update device |
| 126 | 797 | rdnzl | Devices.CheckFirstSeen(iDeviceId) |
| 127 | 797 | rdnzl | Devices.ValueUpdate(iDeviceId, sValue, sValue2, sValue3, sValue4) |
| 128 | 797 | rdnzl | CASE 127 |
| 129 | 797 | rdnzl | Main.WriteDebugLog(("[Shell] Command of device with id '") & iDeviceId & ("' not found!"))
|
| 130 | 797 | rdnzl | CASE ELSE |
| 131 | 797 | rdnzl | Main.WriteDebugLog(("[Shell] Device with id '") & iDeviceId & ("' returned unknown shell error '" & iRc & "'"))
|
| 132 | 797 | rdnzl | END SELECT |
| 133 | 797 | rdnzl | ELSE |
| 134 | 797 | rdnzl | Main.WriteDebugLog(("[Shell] Returned invalid device id!"))
|
| 135 | 797 | rdnzl | ENDIF |
| 136 | 693 | rdnzl | |
| 137 | 693 | rdnzl | CATCH |
| 138 | 693 | rdnzl | Main.WriteDebugLog(("ERROR: Parsing Shell Result: ") & Error.Text & " at " & Error.Where)
|
| 139 | 693 | rdnzl | |
| 140 | 693 | rdnzl | END |
