How to install transmission for Optware on Asus RT-AC68U router


This method can be used for other Asus routers, but I tested it only on my Asus RT-AC68U.

Prerequisites:

  • [optional, but highly recommended] Custom firmware to get extended router functionality and better stability (I recommend asuswrt-merlin);
    • [optional] jffs partition enabled – if you want to access transmission from WAN using custom firewall scripts or to mount a network shared drive to router;
  • Optware installed on your router. Entware is not yet compatible with Asus RT-AC68U. Link for New Generation Optware method at the end of the article;
  • Be sure Optware is installed on a linux partition system (check if your router supports ext4. If not, ext3 or ext2 can be used. The Asus RT-AC68U supports ext4). NTFS and FAT32 are unstable for Optware. I used MiniTool Partition Wizard to format the drive before connecting it to the router.
  • Be sure Download Master is uninstalled (it is incompatible with transmission);
  • libiconv library (converts between character encodings) installed on Optware;
  • nano text editor installed on Optware;
  • You need to enable SSH connection to your router;
  • PuTTY installed on your computer;
  • [optional] Transmission Remote GUI for PC; Torrnado for Android.
  • [optional, but recommended] SWAP activated on the router.

Installing transmission

To install transmission, you need to login to router with PuTTY terminal. Use the username and password required to login to the router’s web interface and run each of the following lines.

ipkg update
ipkg upgrade
ipkg install libiconv
ipkg install nano
ipkg install transmission
wget -c -O /opt/etc/init.d/S95transmission http://tinyurl.com/jd4ovhy
chmod 777 /opt/etc/init.d/S95transmission
/opt/etc/init.d/S95transmission start
/opt/etc/init.d/S95transmission stop
chmod 777 /opt/etc/transmission-daemon/settings.json
rm -r /opt/etc/transmission-daemon/settings.json
wget -c -O /opt/etc/transmission-daemon/settings.json http://tinyurl.com/hbce2xl
app_set_enabled.sh transmission yes

If you receive a 5xx error on wget, it might be because of high traffic on the Dropbox server which hosts the files and you have to try again later or try using the Google cache. If you received no error, transmission should be available at your router’s LAN IP on port 9091 (usualy 192.168.1.1:9091 or router.asus.com:9091). The default username and password are admin / password.

Now you have to stop the transmission-daemon and edit the settings file to customize it to fit your needs (don’t forget to change the default username and password). If you don’t stop the daemon first, the settings will not be saved.

/opt/etc/init.d/S95transmission stop
nano /opt/etc/transmission-daemon/settings.json

For a better understanding of the parameters, check the official transmission documentation (old version of same file here). Now start transmission-daemon again and you can use Transmission Remote GUI / Torrnado to connect to it if you want more features than what the web interface offers. Both apps offer a better way to change the main settings, manage the downloads and they can register to be the default applications for .torrent files and magnet links.

/opt/etc/init.d/S95transmission start

IMPORTANT ISSUE I had with transmission running on Optware

The partition I use to download files to has a label, so instead of using /tmp/mnt/sda1/Torrents I had to use /tmp/mnt/Downloads/Torrents, where “Downloads” is the label of my partition. In my case, if I don’t include the label, Transmission would use /root/tmp as download path which has only a couple of MB free on the disk and transmission-daemon would crash when downloading a torrent.

To check how your drive was mounted and if it has to be used with a label or not, run the following command in PuTTY terminal:

ls -l /tmp/mnt

Download torrents on NAS drives

If you don’t want to download torrents on a disk mounted on the USB port of your router, here are the steps to download on a network shared drive (ex: from a NAS)

#create a directory where you will mount the network shared drive
mkdir /mnt/sda1/nasdrive
chmod 777 /mnt/sda1/nasdrive

#mount drive
mount \\\\192.168.10.1\\MyNetworkSharedDrive /mnt/sda1/nasdrive -t cifs -o "username=shareUser,password=sharePassword"

Replace “\\\\192.168.10.1\\MyNetworkSharedDrive” with the path of your network drive you want to mount on the router.
Backslashes should be escaped or else the shell will misinterpret them.
The effect of the mount command is not persisting after a reboot.

To automatically mount the shared drive on your router after reboot, follow these steps:

  • Activate jffs on your router. You might have to reboot a couple of times for the jffs to be created and formatted;
  • Create/update file “/jffs/scripts/post-mount” with these lines:
#Create/update script
nano /jffs/scripts/post-mount
#!/bin/sh
mount \\\\192.168.10.1\\MyNetworkSharedDrive /mnt/sda1/nasdrive -t cifs -o "username=shareUser,password=sharePassword"
#Give execute rights to the script
chmod a+rx /jffs/scripts/post-mount

WARNING! Anyone with access to post-mount script can see the user name and password of your network shared drive.

Access transmission from WAN

If you want to be able to connect from WAN to transmission, you have to open the port 9091 in you firewall.

If you cannot open it using the router’s web interface you can do it by using a firewall script in jffs. For this you need custom firmware with jffs partition enabled (I recommend asuswrt merlin build). If you don’t have a firewall-start script, run the following commands.

wget -c -O /jffs/scripts/firewall-start http://tinyurl.com/hczpg5g
chmod a+rx /jffs/scripts/firewall-start
nano /jffs/scripts/firewall-start
reboot

If you already have the script, skip line 1 and 2 and just add the following rules to your existing script.

#transmission web interface
iptables -I INPUT -p tcp --destination-port 9091 -j ACCEPT

#transmission listening port
iptables -I INPUT -p tcp --destination-port 51413 -j ACCEPT
iptables -I INPUT -p udp --destination-port 51413 -j ACCEPT

Email notifications from transmission

If you are interested in having email notifications, check merlin’s tutorial to email notifications.

Uninstall transmission

ipkg remove transmission

New Generation Optware

If this tutorial doesn’t work for you, you can also try to install Transmission Download Manager through New Generation Optware.

Info sources:
https://github.com/RMerl/asuswrt-merlin/wiki/Transmission-through-Optware
http://forums.smallnetbuilder.com/showthread.php?t=8696
http://www.nslu2-linux.org/wiki/Optware/Transmission

Latest updates

On 8th of January 2017 this tutorial was still working and the files to be downloaded were available. Let me know in the comments if you encounter any issues.

ASUS RT-AC68U router

How to install Optware on Asus RT-AC68U router


ASUS RT-AC68U router
Optware is a package manager to allow you to easily install and uninstall cross-compiled Linux applications on your device (router, NAS, etc.) over the internet.
An alternative to Optware is Entware, but despite being newer and more modern, Entware is not compatible yet with ARM-based devices so please check compatibility before trying to install.

The router ASUS RT-AC68U is compatible, for the moment, only with Optware.

Prerequisites:

To install Optware on your RT-AC68U you have to follow three simple steps:

  1. Mount the ext4 formatted disk;
  2. Go to router’s web interface (router.asus.com) -> USB Application and install Download Master;
  3. Once successfully installed, uninstall it (not disable). The Optware package will remain installed, but just the Download Master will be removed.

You have to uninstall the Download Master because it is incompatible with transmission for Optware, a better alternative for the torrent client.

As you might run multiple applications on Optware, it is recommended that you activate SWAP on your Asus RT-AC68U router.

This is my list of useful Optware applications that I run on my ASUS RT-AC68U.

Info source:
https://github.com/RMerl/asuswrt-merlin/wiki/Initialize-OPTWARE

How to get the new selected code and description of a Drop-down using JavaScript in LiveCycle Designer


If you want to get the value of a field in LiveCycle Designer using JavaScript you can just use .rawValue, but if you are working with a Drop-down, the rawValue will contain the current value or the old one before your selection and NOT the new selection you made. To get the code and description of the new selection “in real time” use the following code (on events of the drop-down):

var theNewDescription = xfa.event.newText;
var theNewCode = this.boundItem(xfa.event.newText);

How to replace all occurrences of a sub-string in a string with JavaScript


If you need to replace all the occurrences of a sub-string in a string in your JavaScript code, you have to call the built-in function replace() with a regular expression.
More info about the built-in function replace().

Here is a simple function that does that.

/**
 * Replaces all occurrences of "search" in "subject" with "replace".
 * @param {String} search The value being searched for, otherwise known as the needle.
 * @param {String} replace The replacement value that replaces found search values.
 * @param {String} subject The string being searched and replaced on, otherwise known as the haystack.
 */
function replaceAll(search, replace, subject) {
	return subject.replace(new RegExp(search, 'g'), replace);
}

How to modify the “on” value and caption of a repeated Check Box using JavaScript in LiveCycle Designer


If you are building dynamically a list of check boxes in Adobe’s LiveCycle Designer, you will have to be able to dynamically change the “on” value for each of the check boxes or else all the checked items will have the same value (default is 1).

Usually if you want some check boxes, you just drag them from Object Library and set the On Value with the value you want, but there are situations when you want to build dynamically a list of check boxes by repeating one of them.

Regular check boxes in LiveCycle Designer

Regular check boxes in LiveCycle Designer

Repeated check boxes in LiveCycle Designer

Repeated check boxes in LiveCycle Designer

To create a dynamic list of check boxes you have to use a Table (only Tables and Subforms can be set as repeaters) and repeat the row that contains the check box. Here is some example code:

for (var i = 0; i < countItems; i++) {
    // for each checkbox you want to add, create a new instance of the Row
    var rowInstance = form1.page2.Table1._Row1.addInstance(true);

    var myCheckBox = rowInstance.CheckBox1;

    // set the "on" value for the added checkbox
    myCheckBox.items.nodes.item(0).value = theDesiredCode;

    //set the caption of the added checkbox
    myCheckBox.caption.value.text.value = theDesiredCaption;
}

To better understand the code, take a look at the XML source for the repeated checkbox:

   <field name="CheckBox1" w="1.19in" h="0.236222in">
      <ui>
         <checkButton>
            <border>
               <edge stroke="lowered"/>
               <fill/>
            </border>
         </checkButton>
      </ui>
      <font typeface="Myriad Pro"/>
      <margin leftInset="1mm" rightInset="1mm"/>
      <para vAlign="middle"/>
      <value>
         <text>0</text>
      </value>
<caption placement="right" reserve="21.226mm">
         <para vAlign="middle"/>
         <value>
            <text>theDesiredCaption</text>
         </value>
      </caption>

      <items>
         <text>theDesiredCode</text>
         <text>0</text>
      </items>
      <bind match="none"/>
      <border>
         <edge>
            <color/>
         </edge>
         <corner thickness="0.1778mm"/>
      </border>
   </field>

Adobe LiveCycle Designer known restriction:
When you insert a new check box into your form, the default values (one and zero) are set in the XML as so the code above does not work when you want to change to a value other than integer. You have to change them to by modifying directly the XML, or by typing “dummy text” in the field for “on value” and change it back to 1. This will change the XML elements from 1 to 1, as shown in the XML examples below.

<field name="CheckBox1">
...
	<items>
		<integer>1</integer>
		<integer>0</integer>
		<integer>2</integer>
	</items>
...
</field>
Default XML source for a check box
<field name="CheckBox1">
...
	<items>
		<text>1</text>
		<text>0</text>
	</items>
...
</field>
Updated XML source to include strings