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 @ 788

History | View | Annotate | Download (3.9 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 693 rdnzl
  DIM iId, iRc, iCnt AS Integer
95 693 rdnzl
  DIM sOutput, sLine, sValue, sValue2, sValue3, sValue4 AS String
96 693 rdnzl
97 693 rdnzl
  iId = LAST.Tag
98 693 rdnzl
  iRc = LAST.Value
99 693 rdnzl
100 693 rdnzl
  ' save shell output
101 693 rdnzl
  sOutput = cOutput[iId]
102 693 rdnzl
  cOutput.Remove(iId)
103 693 rdnzl
104 693 rdnzl
  SELECT iRC
105 693 rdnzl
    CASE 0
106 693 rdnzl
      FOR EACH sLine IN Split(sOutput, "\n")
107 693 rdnzl
        SELECT iCnt
108 693 rdnzl
          CASE 0
109 693 rdnzl
            sValue = sLine
110 693 rdnzl
          CASE 1
111 693 rdnzl
            sValue2 = sLine
112 693 rdnzl
          CASE 2
113 693 rdnzl
            sValue3 = sLine
114 693 rdnzl
          CASE 3
115 693 rdnzl
            sValue4 = sLine
116 693 rdnzl
        END SELECT
117 693 rdnzl
        INC iCnt
118 693 rdnzl
      NEXT
119 693 rdnzl
      ' debug output
120 693 rdnzl
      IF Main.bShellDebug THEN
121 693 rdnzl
        Main.WriteDebugLog("[Shell] < '" & sOutput)
122 693 rdnzl
        Main.WriteDebugLog(("[Shell] Device with id '") & iId & ("' returned value(s)") & IIf(sValue, " '" & sValue & "'", "") & IIf(sValue2, " '" & sValue2 & "'", "") & IIf(sValue3, " '" & sValue3 & "'", "") & IIf(sValue4, " '" & sValue4 & "'", "") & ".")
123 693 rdnzl
      ENDIF
124 693 rdnzl
      ' find and update device
125 693 rdnzl
      Devices.CheckFirstSeen(iId)
126 693 rdnzl
      Devices.ValueUpdate(iId, sValue, sValue2, sValue3, sValue4)
127 693 rdnzl
    CASE 127
128 724 rdnzl
      Main.WriteDebugLog(("[Shell] Command of device with id '") & iId & ("' not found!"))
129 693 rdnzl
    CASE ELSE
130 724 rdnzl
      Main.WriteDebugLog(("[Shell] Device with id '") & iId & ("' returned unknown shell error '" & iRc & "'"))
131 693 rdnzl
    END SELECT
132 693 rdnzl
133 693 rdnzl
CATCH
134 693 rdnzl
  Main.WriteDebugLog(("ERROR: Parsing Shell Result: ") & Error.Text & " at " & Error.Where)
135 693 rdnzl
136 693 rdnzl
END