Luna Send

webOS applications may have backend components (that may not be implementable in JavaScript, or require extra hardware processing of native language) that are accessed through the Mojo.Service API. The browser engine delegates these calls from JavaScript to the backend components through a message bus infrastructure, like D-Bus.

With root permissions, the end user may be able to interact with the backends directly with the luna-send utility.

webOS 1.x
For example, the following JavaScript fragment: Mojo.Service.Request("palm://com.palm.systemservice/time", { method: "getSystemTime", onSuccess: callback });

corresponds to

luna-send -n 1 palm://com.palm.systemservice/time/getSystemTime {}

Since these are all effectively D-Bus calls, a luna-send call can be made equivalently with dbus-send, for example, the two commands below yield the same result:

luna-send -n 1 palm://com.palm.systemservice/time/getSystemTime {} dbus-send --system --type=method_call --print-reply --dest=com.palm.systemservice /time org.json.getSystemTime string:"{}"

webOS 2.x
webOS 2.x does away with the standard dbus daemon and uses a similar, but ultimately proprietary message bus infrastructure, not based on D-Bus. It maintains the notion of a private and public bus like D-Bus, but is instead served by ls-hubd, which does not link against D-Bus but instead against liblunaservice.so.

The luna-send interface is the same, however.

Examples
Install all your purchased apps: luna-send -n 1 palm://com.palm.service.backup/scheduleAppRestore '{}' luna-send -n 1 palm://com.palm.service.backup/restoreApps '{}'

Kick off a manual Palm Backup entirely from the command line: luna-send -n 1 palm://com.palm.applicationManager/launch '{"id":"com.palm.app.backup"}' luna-send -n 1 palm://com.palm.backup/startBackup '{}' luna-send -n 1 palm://com.palm.applicationManager/running '{}' luna-send -n 1 palm://com.palm.applicationManager/close '{"processId":"(GET ID NUMBER FROM /RUNNING)"}'

Connect to any (known) WAP in range (or simply turn on WiFi): luna-send -n 1 palm://com.palm.wifi/setstate '{"state":"enabled"}' luna-send -n 1 palm://com.palm.wifi/findnetworks '{""}'

Disconnect from WiFi: luna-send -n 1 palm://com.palm.wifi/setstate '{"state":"disabled"}'

Turn Bluetooth ON: luna-send -n 1 palm://com.palm.btmonitor/monitor/radioon '{"visible":true, "connectable":true}'

Turn Bluetooth OFF: luna-send -n 1 palm://com.palm.btmonitor/monitor/radiooff {}

Using luna-send to refresh the Launcher panel. luna-send -n 1 palm://com.palm.applicationManager/rescan {}

Get a list of all installed apps: luna-send -n 1 "palm://com.palm.applicationManager/listLaunchPoints" "{}"

Using luna-send to launch an application: luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\"} luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\",\"params\":{\"scene\":\"page\",\"target\":\"http://www.google.com\"}}

The second command shows how to open www.google.com when the browser is launched.

Using luna-send to download a file to /media/internal/downloads/: luna-send -n 1 palm://com.palm.downloadmanager/download {\"target\":\"http://www.google.com/index.html\"}

Replace www.google.com/index.html with whatever file you want downloaded.

Using luna-send to first import and then set the wallpaper image:

luna-send -n 1 palm://com.palm.systemservice/wallpaper/importWallpaper {"target": "/media/internal/wallpapers/your_file.jpg" } luna-send -n 1 palm://com.palm.systemservice/setPreferences {"wallpaper": {"wallpaperName": "your_file.jpg", "wallpaperFile": "/media/internal/wallpapers/your_file.jpg"}}

Replace your_file.jpg with whatever file in the wallpapers folder you want for your next wallpaper.

Using luna-send to control the palm progress animation (The pulsing "palm" logo seen at boot):

luna-send -n 1 palm://com.palm.systemmanager/runProgressAnimation {\"state\":\"start\"} luna-send -n 1 palm://com.palm.systemmanager/runProgressAnimation {\"state\":\"stop\"}

TODO: These should probably be plugged into the Tracker app.

luna-send -n 1 palm://com.palm.location/setUseGps {\"useGps\":\"true\"} luna-send -n 1 palm://com.palm.location/setAutoLocate {\"autoLocate\":\"true\"} luna-send -n 1 palm://com.palm.location/getCurrentPosition {}

List all of the processes which are running: sudo luna-send -n 1 palm://com.palm.applicationManager/running {} Interesting note: Seems everything with a processid below 1008 are static. As seen above, open camera app has pid 1014 and startup app is pid 1003
 * Message: serviceResponse Handling: 2, { "running": [ { "id": "com.palm.launcher", "processid": "1006" }, { "id": "com.palm.systemui", "processid": "1007" }, { "id": "com.palm.app.email", "processid": "1000" }, { "id": "com.palm.app.phone", "processid": "1001" }, { "id": "com.palm.app.contacts", "processid": "1002" }, { "id": "com.palm.app.camera", "processid": "1003" }, { "id": "com.palm.app.messaging", "processid": "1004" }, { "id": "com.palm.app.calendar", "processid": "1005" }, { "id": "com.palm.app.phone", "processid": "1008" }, { "id": "com.palm.app.camera", "processid": "1014" } ] }

Close a process:

luna-send -n 1 "palm://com.palm.applicationManager/close" "{\"processId\":\"1058\"}"

Activate the vibrator:

luna-send -n 1 palm://com.palm.vibrate/vibrate {\"period\":1,\"duration\":1000\} The duration value is in milliseconds and can be adjusted as desired.

Photos Info - list album and image from mediadb.db3:

luna-send -n 1 luna://com.palm.mediadb/image/listalbums {}

luna-send -n 1 luna://com.palm.mediadb/image/listimages {}

Set system volume - "volume" range is 0-100

luna-send -n 1 palm://com.palm.audio/system/setVolume '{"volume":80}'

Set media volume - "volume" range is 0-100

luna-send -n 1 palm://com.palm.audio/media/setVolume '{"volume":80}'

Set ringtone volume - "volume" range is 0-100

luna-send -n 1 palm://com.palm.audio/ringtone/setVolume '{"volume":100}'

Dial a number - this actually calls the number, not just setup

luna-send -n 1 palm://com.palm.telephony/dial '{"number":"8001234567"}'

Hash command RTN: ##RTN# aka ##786# commands using Luna-Send (Becarful Palm calls this Nuking your phone and do not remove battery when using

luna-send -n 1 luna://com.palm.telephony/radioDefaultsRestore {} luna-send -n 1 luna://com.palm.telephony/resetRadio {} luna-send -n 1 luna://com.palm.storage/erase/EraseAll {}

Hang up a phone call :-) There are ways to end specific types of calls but I think this is good enough for now. Let me know if you want the other methods.

luna-send -n 1 palm://com.palm.telephony/hangupAll {}

Send a text message - only need to change phone "value" and "messageText"

luna-send -n 1 palm://com.palm.messaging/sendMessageFromCompose '{"recipientJSONArray": [{"lastName": "", "pictureLoc": "", "contactCount": 1, "displayText": "", "firstName": "", "pictureLocBig": "", "imAvailability": 6, "pictureLocSquare": "", "contactDisplay": "", "Person_id": "", "personId": "", "type": "phone", "value": "8165551234", "alreadyValidated": true, "prefix": "to$A", "identifier": ""}], "messageText": "Content of message here"}'

set phone to no roam (home network only) luna-send -n 1 palm://com.palm.telephony//roamModeSet '{"mode":"homeonly"}'

set phone to auto roam luna-send -n 1 palm://com.palm.telephony//roamModeSet '{"mode":"any"}'

set phone to roam only luna-send -n 1 palm://com.palm.telephony//roamModeSet '{"mode":"roamonly"}'

Applications
Notes (view notes): luna-send -n 1 palm://com.palm.notes/getNotes {}

Storage
Enter usb storage mode: luna-send -n 1 palm://com.palm.storage/diskmode/enterMSM {\"user-confirmed\":true,\"enterIMasq\":false}

Exit usb storage mode (toggle): luna-send -n 1 palm://com.palm.storage/diskmode/enterMSM {\"user-confirmed\":true,\"enterIMasq\":false}

Airplane Mode
Enable Airplane Mode: luna-send -n 1 palm://com.palm.systemservice/setPreferences '{"airplaneMode":true}'

Disable Airplane Mode: luna-send -n 1 palm://com.palm.systemservice/setPreferences '{"airplaneMode":false}'

Searching for services
As mentioned above, since Mojo.Service.Request (or, equivalently, through the scene controller's serviceRequest</tt> method) make use of D-Bus, we can use two methods to determine what external calls can be made to their backend components

By examining JavaScript source
Simply grep through the application for Mojo.Service.Request</tt> or serviceRequest</tt> calls and note how they are invoked. They then can be adapted to use luna-send</tt>.

By examining dbus traffic directly
There are some tools available to trace D-Bus calls happening as the application is running, such as dbus-monitor</tt> or dbus-util</tt>.

Example
To determine what governs roaming mode capability, we may do the following. com.palm.luna2 com.palm.telephony      //roamModeSet   Â«string=â{"mode": "homeonly"}
 * 1) dbus-util --capture 2>&1 |tee /tmp/dbus.dump
 * 2) grep roam /tmp/dbus.dump

From this we see:
 * com.palm.telephony</tt> is the service
 * roamModeSet is the method
 * { mode: "homeonly" }</tt> is the parameter

Thus: luna-send -n 1 palm://com.palm.telephony/roamModeSet '{"mode":"homeonly"}'

would perform the same function from the command line.