Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
D
domotikad
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
domotika
domotikad
Commits
98c0b06f
Commit
98c0b06f
authored
Jan 16, 2014
by
nextime
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better managing for plugin and daemons web redirection
parent
a99f376f
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
165 additions
and
78 deletions
+165
-78
zwave.conf
daemons/zwave/conf/zwave.conf
+2
-0
zwave2.py
daemons/zwave/zwave2.py
+0
-42
zwaved.py
daemons/zwave/zwaved.py
+81
-0
domotika.py
domotika/domotika.py
+0
-3
plugins.py
domotika/plugins.py
+0
-4
proxy.py
domotika/web/proxy.py
+26
-7
web.py
domotika/web/web.py
+56
-22
No files found.
daemons/zwave/conf/zwave.conf
0 → 100644
View file @
98c0b06f
[
web
]
port
:
80
daemons/zwave/zwave2.py
deleted
100755 → 0
View file @
a99f376f
#!/usr/bin/python
import
sys
,
os
import
time
import
libopenzwave
from
libopenzwave
import
PyManager
"""
{'homeId': 23191651L, 'event': 0, 'valueId': {'index': 0, 'units': '', 'type': 'Bool', 'nodeId': 2, 'value': None, 'commandClass': 'COMMAND_CLASS_NO_OPERATION', 'instance': 1, 'readOnly': False, 'homeId': 23191651L, 'label': '', 'genre': 'Basic', 'id': 72057594071482368L}, 'notificationType': 'NodeEvent', 'nodeId': 2}
"""
def
callback
(
res
):
print
'------------------------------'
print
res
print
'=============================='
if
'valueId'
in
res
.
keys
():
if
'nodeId'
in
res
[
'valueId'
]
.
keys
():
#nid=res['valueId']['nodeId']
nid
=
res
[
'nodeId'
]
hid
=
res
[
'homeId'
]
ntype
=
res
[
'notificationType'
]
print
'NOTIFICATION'
,
ntype
print
'NODEID:'
,
nid
,
'NodeLocation:'
,
manager
.
getNodeLocation
(
hid
,
nid
)
print
'NODETYPE:'
,
manager
.
getNodeType
(
hid
,
nid
)
print
'NODENAME:'
,
manager
.
getNodeName
(
hid
,
nid
)
print
'NODEBASIC:'
,
manager
.
getNodeBasic
(
hid
,
nid
)
print
'NODEGENERIC:'
,
manager
.
getNodeGeneric
(
hid
,
nid
)
print
'NODESPECIFIC:'
,
manager
.
getNodeSpecific
(
hid
,
nid
)
print
'NODEMANUFACTURERNAME:'
,
manager
.
getNodeManufacturerName
(
hid
,
nid
)
print
'NODEPRODUCTNAME:'
,
manager
.
getNodeProductName
(
hid
,
nid
)
print
'******************************'
options
=
libopenzwave
.
PyOptions
()
#options.create("openzwave/","","--logging false")
options
.
create
(
"openzwave/"
,
""
,
""
)
options
.
lock
()
manager
=
libopenzwave
.
PyManager
()
manager
.
create
()
manager
.
addWatcher
(
callback
)
manager
.
addDriver
(
"/dev/ttyUSB0"
)
time
.
sleep
(
360000
)
daemons/zwave/zwaved.py
0 → 100755
View file @
98c0b06f
#!/usr/bin/python
import
sys
,
os
import
time
import
libopenzwave
from
libopenzwave
import
PyManager
from
twisted.internet
import
epollreactor
epollreactor
.
install
()
from
twisted.internet
import
reactor
from
dmlib.daemonizer
import
Daemonizer
import
logging
,
time
,
sys
,
os
from
logging
import
handlers
as
loghandlers
try
:
import
setproctitle
setproctitle
.
setproctitle
(
'domotika_zwaved'
)
print
'Setting process title to'
,
sys
.
argv
[
0
]
except
:
pass
log
=
logging
.
getLogger
(
'ZWaved'
)
#sys.path.append(os.path.abspath(os.path.dirname(sys.argv[0])+"/../../"))
"""
{'homeId': 23191651L, 'event': 0, 'valueId': {'index': 0, 'units': '', 'type': 'Bool', 'nodeId': 2, 'value': None, 'commandClass': 'COMMAND_CLASS_NO_OPERATION', 'instance': 1, 'readOnly': False, 'homeId': 23191651L, 'label': '', 'genre': 'Basic', 'id': 72057594071482368L}, 'notificationType': 'NodeEvent', 'nodeId': 2}
"""
class
DMZWave
(
object
):
def
__init__
(
self
):
self
.
options
=
libopenzwave
.
PyOptions
()
#self.options.create("openzwave/","","--logging false")
self
.
options
.
create
(
"openzwave/"
,
""
,
""
)
self
.
options
.
lock
()
self
.
manager
=
libopenzwave
.
PyManager
()
self
.
manager
.
create
()
self
.
manager
.
addWatcher
(
self
.
callback
)
self
.
manager
.
addDriver
(
"/dev/ttyUSB0"
)
def
callback
(
self
,
res
):
print
'------------------------------'
print
res
print
'=============================='
if
'valueId'
in
res
.
keys
():
if
'nodeId'
in
res
[
'valueId'
]
.
keys
():
#nid=res['valueId']['nodeId']
nid
=
res
[
'nodeId'
]
hid
=
res
[
'homeId'
]
ntype
=
res
[
'notificationType'
]
print
'NOTIFICATION'
,
ntype
print
'NODEID:'
,
nid
,
'NodeLocation:'
,
self
.
manager
.
getNodeLocation
(
hid
,
nid
)
print
'NODETYPE:'
,
self
.
manager
.
getNodeType
(
hid
,
nid
)
print
'NODENAME:'
,
self
.
manager
.
getNodeName
(
hid
,
nid
)
print
'NODEBASIC:'
,
self
.
manager
.
getNodeBasic
(
hid
,
nid
)
print
'NODEGENERIC:'
,
self
.
manager
.
getNodeGeneric
(
hid
,
nid
)
print
'NODESPECIFIC:'
,
self
.
manager
.
getNodeSpecific
(
hid
,
nid
)
print
'NODEMANUFACTURERNAME:'
,
self
.
manager
.
getNodeManufacturerName
(
hid
,
nid
)
print
'NODEPRODUCTNAME:'
,
self
.
manager
.
getNodeProductName
(
hid
,
nid
)
print
'******************************'
class
ZWaved
(
Daemonizer
):
def
main_loop
(
self
):
DMZWave
()
reactor
.
run
()
if
__name__
==
'__main__'
:
if
len
(
sys
.
argv
)
>
1
:
log
.
debug
(
"Starting daemon with option "
+
sys
.
argv
[
1
])
ZWaved
()
.
process_command_line
(
sys
.
argv
)
else
:
print
'Please specify start, stop or debug option'
domotika/domotika.py
View file @
98c0b06f
...
...
@@ -2201,9 +2201,6 @@ class domotikaService(service.Service):
def
web_on_getAuth
(
self
,
usr
,
pwd
):
return
dmdb
.
Users
.
find
(
where
=
[
"username='
%
s' AND passwd='
%
s' AND active=1"
%
(
usr
,
pwd
)])
def
web_on_pluginRequest
(
self
,
pname
,
ppath
,
pargs
,
pheaders
):
return
self
.
plugins
.
webRequest
(
pname
,
ppath
,
pargs
,
pheaders
)
def
web_on_getPermissionForPath
(
self
,
user
,
path
):
return
dmdb
.
getPermissionForPath
(
user
,
path
)
...
...
domotika/plugins.py
View file @
98c0b06f
...
...
@@ -321,10 +321,6 @@ class Loader(object):
else
:
log
.
debug
(
"Plugin "
+
str
(
plugin
)
+
" doesn't exists or not loaded"
)
def
webRequest
(
self
,
pname
,
ppath
,
pargs
,
pheaders
):
self
.
push_request
(
pname
,
[
'WEB'
,
ppath
,
base64
.
b64encode
(
pargs
),
base64
.
b64encode
(
pheaders
)])
return
'OK'
# XXX vediamo di ritornare qualcosa di utile?
def
loadPlugin
(
self
,
name
):
if
name
in
PLUGINREGISTRY
.
plugins
.
keys
():
log
.
debug
(
"stopping plugin "
+
str
(
name
))
...
...
domotika/web/proxy.py
View file @
98c0b06f
...
...
@@ -39,7 +39,7 @@ import logging
log
=
logging
.
getLogger
(
'Proxy'
)
class
Apache
ProxyClient
(
ProxyClient
):
class
Web
ProxyClient
(
ProxyClient
):
def
handleHeader
(
self
,
key
,
value
):
if
key
.
lower
()
==
'location'
:
log
.
debug
(
"Manage location header"
)
...
...
@@ -92,7 +92,7 @@ class ApacheProxyClient(ProxyClient):
resource
.
reactor
.
disconnect
()
class
Apache
ProxyClientFactory
(
ProxyClientFactory
):
class
Web
ProxyClientFactory
(
ProxyClientFactory
):
def
__init__
(
self
,
command
,
rest
,
version
,
headers
,
data
,
father
,
resource
):
self
.
resource
=
resource
ProxyClientFactory
.
__init__
(
self
,
...
...
@@ -104,7 +104,7 @@ class ApacheProxyClientFactory(ProxyClientFactory):
father
=
father
)
def
buildProtocol
(
self
,
addr
):
return
Apache
ProxyClient
(
command
=
self
.
command
,
return
Web
ProxyClient
(
command
=
self
.
command
,
rest
=
self
.
rest
,
version
=
self
.
version
,
headers
=
self
.
headers
,
...
...
@@ -119,19 +119,27 @@ def hostport(host, port, headerhost, defaultport=80):
return
'
%
s:
%
d'
%
(
host
,
port
)
class
Apache
ProxyResource
(
ReverseProxyResource
):
class
Web
ProxyResource
(
ReverseProxyResource
):
""" Just to permit future modifications """
clientFactory
=
ApacheProxyClientFactory
clientFactory
=
WebProxyClientFactory
remove
=
False
def
__init__
(
self
,
*
arg
,
**
kwarg
):
log
.
debug
(
"ApacheProxy called"
)
log
.
debug
(
"WebProxy called"
)
#try:
if
True
:
if
'remove'
in
kwarg
.
keys
():
self
.
remove
=
int
(
kwarg
[
'remove'
])
del
kwarg
[
'remove'
]
#except:
# log.debug("error in remove")
return
ReverseProxyResource
.
__init__
(
self
,
*
arg
,
**
kwarg
)
def
getChild
(
self
,
path
,
request
):
log
.
debug
(
"APACHE PROXY SEND HEADERS "
+
str
(
request
.
requestHeaders
))
#return ReverseProxyResource.getChild(self, path, request)
return
ApacheProxyResource
(
self
.
host
,
self
.
port
,
self
.
path
+
'/'
+
urlquote
(
path
,
safe
=
""
)
)
return
WebProxyResource
(
self
.
host
,
self
.
port
,
self
.
path
+
'/'
+
urlquote
(
path
,
safe
=
""
),
remove
=
self
.
remove
)
def
render
(
self
,
request
):
...
...
@@ -159,6 +167,17 @@ class ApacheProxyResource(ReverseProxyResource):
rest
=
self
.
path
+
'?'
+
qs
else
:
rest
=
self
.
path
if
rest
.
startswith
(
"//"
):
rest
=
rest
[
1
:]
if
self
.
remove
:
tmprest
=
"/"
.
join
([
x
for
x
in
rest
.
split
(
"/"
)
if
x
!=
''
][
self
.
remove
:])
if
rest
.
endswith
(
'/'
):
tmprest
+=
"/"
rest
=
"/"
+
tmprest
log
.
debug
(
"Proxying requesto to "
+
str
(
rest
))
clientFactory
=
self
.
clientFactory
(
command
=
request
.
method
,
rest
=
rest
,
version
=
request
.
clientproto
,
...
...
domotika/web/web.py
View file @
98c0b06f
...
...
@@ -59,7 +59,7 @@ from twisted.internet import defer
from
nevow
import
appserver
import
time
import
auth
from
dmlib.utils.genutils
import
configFile
import
phpserialize
log
=
logging
.
getLogger
(
'Webgui'
)
...
...
@@ -129,24 +129,58 @@ class RootPage(rend.Page):
return
session
.
sse
return
self
.
childFactory
(
ctx
,
'sse'
)
def
child_plugin
(
self
,
ctx
):
def
child_
raw
plugin
(
self
,
ctx
):
request
=
inevow
.
IRequest
(
ctx
)
pl
=
request
.
path
.
split
(
"/"
)
if
len
(
pl
)
>
=
2
:
if
len
(
pl
)
>
2
:
pname
=
pl
[
2
]
ppath
=
"/"
.
join
(
pl
[
3
:])
pargs
=
urllib
.
urlencode
(
request
.
args
)
pheaders
=
""
for
hk
,
hv
in
request
.
requestHeaders
.
getAllRawHeaders
():
for
hvv
in
hv
:
pheaders
=
hk
+
"="
+
hvv
+
"
\r\n
"
if
pheaders
.
endswith
(
"
\r\n
"
):
pheaders
=
pheaders
[:
-
2
]
ret
=
self
.
core
.
pluginRequest
(
pname
,
ppath
,
pargs
,
pheaders
)
r
=
codeOk
()
r
.
setContent
(
ret
)
return
r
return
self
.
childFactory
(
ctx
,
'plugin'
)
pconf
=
os
.
path
.
normpath
(
"/"
.
join
([
curdir
,
'plugins'
,
pname
,
'conf'
,
pname
+
".conf"
]))
log
.
debug
(
"trying to read "
+
str
(
dconf
))
if
os
.
path
.
isfile
(
dconf
):
try
:
pcfg
=
configFile
(
pconf
)
pcfg
.
readConfig
()
port
=
int
(
pcfg
.
get
(
'web'
,
'port'
))
except
:
port
=
False
log
.
debug
(
"Cannot read config file for plugin "
+
pname
)
if
port
:
self
.
_sendProxySession
(
request
,
ctx
)
log
.
debug
(
"Proxying to plugin path "
+
str
(
request
.
path
))
return
proxy
.
WebProxyResource
(
'localhost'
,
port
,
path
=
'/'
,
remove
=
1
)
else
:
log
.
debug
(
"Plugin hasn't a conf file to read"
)
else
:
log
.
debug
(
"no plugin name in request"
)
return
self
.
childFactory
(
ctx
,
'rawplugin'
)
def
child_rawdaemon
(
self
,
ctx
):
request
=
inevow
.
IRequest
(
ctx
)
log
.
debug
(
"Raw Daemon request for "
+
str
(
request
.
path
))
pl
=
request
.
path
.
split
(
"/"
)
if
len
(
pl
)
>
2
:
dname
=
pl
[
2
]
dconf
=
os
.
path
.
normpath
(
"/"
.
join
([
curdir
,
'daemons'
,
dname
,
'conf'
,
dname
+
".conf"
]))
log
.
debug
(
"trying to read "
+
str
(
dconf
))
if
os
.
path
.
isfile
(
dconf
):
try
:
dcfg
=
configFile
(
dconf
)
dcfg
.
readConfig
()
port
=
int
(
dcfg
.
get
(
'web'
,
'port'
))
except
:
port
=
False
log
.
debug
(
"Cannot read config file for daemon "
+
dname
)
if
port
:
self
.
_sendProxySession
(
request
,
ctx
)
log
.
debug
(
"Proxying to daemon path "
+
str
(
request
.
path
))
return
proxy
.
WebProxyResource
(
'localhost'
,
port
,
path
=
'/'
,
remove
=
1
)
else
:
log
.
debug
(
"Daemon hasn't a conf file to read"
)
else
:
log
.
debug
(
"no daemon name in request"
)
return
self
.
childFactory
(
ctx
,
'rawdaemon'
)
def
child_mediaproxy
(
self
,
ctx
):
if
str
(
self
.
core
.
configGet
(
'web'
,
'enablemediagui'
))
.
lower
()
in
[
'yes'
,
'1'
,
'y'
,
'true'
]:
...
...
@@ -248,7 +282,7 @@ class RootPage(rend.Page):
#log.info("Request: "+str(request))
if
host
and
host
in
self
.
core
.
configGet
(
'proxy'
,
'localproxyhosts'
)
.
split
(
','
):
self
.
_sendProxySession
(
request
,
ctx
)
return
proxy
.
Apache
ProxyResource
(
'localhost'
,
int
(
self
.
core
.
configGet
(
'proxy'
,
'localproxyport'
)),
path
=
'/'
)
return
proxy
.
Web
ProxyResource
(
'localhost'
,
int
(
self
.
core
.
configGet
(
'proxy'
,
'localproxyport'
)),
path
=
'/'
)
else
:
if
self
.
logged
:
if
(
len
(
self
.
perms
.
homepath
))
>
0
:
...
...
@@ -266,12 +300,12 @@ class RootPage(rend.Page):
#log.info("childFactory2 "+str(request))
if
name
in
self
.
core
.
configGet
(
'proxy'
,
'localproxypaths'
)
.
split
(
','
):
self
.
_sendProxySession
(
request
,
ctx
)
return
proxy
.
Apache
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
)
return
proxy
.
Web
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
)
host
=
request
.
getHeader
(
'host'
)
log
.
debug
(
"HOST CALLED: "
+
str
(
host
))
if
host
and
host
in
self
.
core
.
configGet
(
'proxy'
,
'localproxyhosts'
)
.
split
(
','
):
self
.
_sendProxySession
(
request
,
ctx
)
return
proxy
.
Apache
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
)
return
proxy
.
Web
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
)
log
.
debug
(
"No child found (
%
s)"
%
name
)
return
permissionDenied
()
...
...
@@ -288,7 +322,7 @@ class SessionWrapper(guard.SessionWrapper):
log
.
debug
(
"SessionWrapper HOST CALLED: "
+
str
(
host
))
if
host
and
host
in
self
.
core
.
configGet
(
'proxy'
,
'localproxyhostsnologin'
)
.
split
(
','
):
log
.
debug
(
"Proxy Bypass Host in SessionWrapper renderHTTP "
+
host
)
return
proxy
.
Apache
ProxyResource
(
'localhost'
,
int
(
self
.
core
.
configGet
(
'proxy'
,
'localproxyport'
)),
path
=
'/'
)
return
proxy
.
Web
ProxyResource
(
'localhost'
,
int
(
self
.
core
.
configGet
(
'proxy'
,
'localproxyport'
)),
path
=
'/'
)
return
guard
.
SessionWrapper
.
renderHTTP
(
self
,
ctx
)
...
...
@@ -306,7 +340,7 @@ class SessionWrapper(guard.SessionWrapper):
for
n
in
self
.
core
.
configGet
(
'proxy'
,
'localproxypathsnologin'
)
.
split
(
','
):
if
n
and
name
.
startswith
(
n
):
log
.
info
(
"Proxy Bypass localproxypathsnologin locateChild "
+
name
)
return
(
proxy
.
Apache
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
),
''
)
return
(
proxy
.
Web
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
),
''
)
for
n
in
self
.
core
.
configGet
(
'web'
,
'nologinpaths'
)
.
split
(
','
):
if
n
and
name
.
startswith
(
n
):
if
not
((
name
==
n
and
n
.
endswith
(
"/"
))
or
(
name
[:
-
1
]
==
n
and
name
.
endswith
(
"/"
))):
...
...
@@ -317,7 +351,7 @@ class SessionWrapper(guard.SessionWrapper):
for
n
in
self
.
core
.
configGet
(
'proxy'
,
'localproxyhostsnologin'
)
.
split
(
','
):
if
n
and
host
==
n
:
log
.
info
(
"Proxy Bypass Host in SessionWrapper locateChild "
+
host
)
return
(
proxy
.
Apache
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
),
''
)
return
(
proxy
.
Web
ProxyResource
(
'localhost'
,
80
,
path
=
'/'
+
name
),
''
)
u
=
self
.
core
.
configGet
(
'web'
,
'nologindefaultuser'
)
p
=
self
.
core
.
configGet
(
'web'
,
'nologindefaultpass'
)
for
n
in
self
.
core
.
configGet
(
'web'
,
'nologinips'
)
.
split
(
','
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment