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.

Statistics
| Revision:

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