Skip to content

Instantly share code, notes, and snippets.

@tomaski
Created January 29, 2020 21:51
Show Gist options
  • Save tomaski/d61f0ee71aa57862d19e96c7edd8b34b to your computer and use it in GitHub Desktop.
Save tomaski/d61f0ee71aa57862d19e96c7edd8b34b to your computer and use it in GitHub Desktop.
Tasker OpenVPN config with Quick Settings toggle button
=== PREREQUISITES ===
in order to get this working, following apps need to be installed on the phone (Android only):
Tasker
OpenVPN
AutoNotification plugin for Tasker
=== OPENVPN CONFIG ===
1) edit the provided file to suit your specific configuration (usually changing URL and ports should suffice)
2) copy the config file to the "OpenVPN" folder (create if not present) on your phone internal memory (SD should be fine too, but internal memory is safer)
3) open the OpenVPN app and import the config file
4) name the connection (you're gonna need it later)
5) start the connection to see if it's working
=== TASKER CONFIG ===
1) copy the task file to Tasker/tasks/ folder on your phone
2) open Tasker
3) if Tasker didnt import the task automatically, do it manually:
3.1) press and hold on "tasks" tab
3.2) select "import task"
3.3) select location and click on the file you want to import
4) open the newly imported task and edit action numer 3 (send intent) filling in your profile name
5) create quick settings tile to be able to quickly toggle VPN on and off (OPTIONAL)
5.1) preferences -> action -> quick settings tasks
5.2) click the search icon and select the VPN profile from the list
client
dev tun
proto udp
remote YOUR_URL_HERE YOUR_PORT_HERE
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-128-CBC
comp-lzo
verb 5
dhcp-option DNS 1.1.1.1
<TaskerData sr="" dvi="1" tv="5.9.1">
<Task sr="task36">
<cdate>1540209393631</cdate>
<edate>1580334047673</edate>
<id>36</id>
<nme>VPN</nme>
<pri>100</pri>
<Action sr="act0" ve="7">
<code>565385068</code>
<label>Check notification area if there's already an active VPN connection</label>
<Bundle sr="arg0">
<Vals sr="val">
<AllFields>false</AllFields>
<AllFields-type>java.lang.Boolean</AllFields-type>
<BigImageNames>&lt;null&gt;</BigImageNames>
<BigImageNames-type>java.lang.String</BigImageNames-type>
<BigTextNames>&lt;null&gt;</BigTextNames>
<BigTextNames-type>java.lang.String</BigTextNames-type>
<HasReplyAction>false</HasReplyAction>
<HasReplyAction-type>java.lang.Boolean</HasReplyAction-type>
<ImageNames>&lt;null&gt;</ImageNames>
<ImageNames-type>java.lang.String</ImageNames-type>
<InterceptApps>&lt;StringArray sr=""/&gt;</InterceptApps>
<InterceptApps-type>[Ljava.lang.String;</InterceptApps-type>
<InterceptPersistent>2</InterceptPersistent>
<InterceptPersistent-type>java.lang.String</InterceptPersistent-type>
<InternalActionsBig>&lt;null&gt;</InternalActionsBig>
<InternalActionsBig-type>java.lang.String</InternalActionsBig-type>
<InternalActionsSmall>&lt;null&gt;</InternalActionsSmall>
<InternalActionsSmall-type>java.lang.String</InternalActionsSmall-type>
<QueryAnyMatch>&lt;null&gt;</QueryAnyMatch>
<QueryAnyMatch-type>java.lang.String</QueryAnyMatch-type>
<QueryAppName>&lt;null&gt;</QueryAppName>
<QueryAppName-type>java.lang.String</QueryAppName-type>
<QueryAppPackage>net.openvpn.openvpn</QueryAppPackage>
<QueryAppPackage-type>java.lang.String</QueryAppPackage-type>
<QueryText>&lt;null&gt;</QueryText>
<QueryText-type>java.lang.String</QueryText-type>
<QueryTitle>&lt;null&gt;</QueryTitle>
<QueryTitle-type>java.lang.String</QueryTitle-type>
<SnoozedNotifications>false</SnoozedNotifications>
<SnoozedNotifications-type>java.lang.Boolean</SnoozedNotifications-type>
<TextNames>&lt;null&gt;</TextNames>
<TextNames-type>java.lang.String</TextNames-type>
<UseRegex>false</UseRegex>
<UseRegex-type>java.lang.Boolean</UseRegex-type>
<com.twofortyfouram.locale.intent.extra.BLURB>Persistency Type: Persistent Only
Package: net.openvpn.openvpn</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%anapp()
01. App name
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anbackgroundimage()
Background Image
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anbigicon()
04. Icon When Expanded
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;%anbutton1action()
13. Button Action 1
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4&gt;%anbutton1icon()
13. Button 1 Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5&gt;%anbutton1text()
12. Button 1 Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6&gt;%anbutton2action()
15. Button 2 Action
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7&gt;%anbutton2icon()
15. Button 2 Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8&gt;%anbutton2text()
14. Button 2 Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9&gt;%anbutton3action()
17. Button 3 Action
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10&gt;%anbutton3icon()
17. Button 3 Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11&gt;%anbutton3text()
16. Button 3 Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12&gt;%anbutton4action()
18. Button 4 Action
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13&gt;%anbutton4icon()
18. Button 4 Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14&gt;%anbutton4text()
18. Button 4 Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15&gt;%anbutton5action()
19. Button 5 Action
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16&gt;%anbutton5icon()
19. Button 5 Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17&gt;%anbutton5text()
19. Button 5 Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES18&gt;%ancancelreason()
Reason Cancelled Code
Code of the reason the notification was cancelled&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES18&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES19&gt;%ancancelreasontext()
Reason Cancelled Text
Reason the notification was cancelled&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES19&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES20&gt;%ancategoryid()
Category ID
Notification's category ID&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES20&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES21&gt;%ancolor()
Color
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES21&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES22&gt;%andismissaction()
23. Action On Dismiss Id
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES22&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES23&gt;%anextrainfo()
Extra Info
Extra info that you can add to an AutoNotification notification when you create it. Empty for others.&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES23&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES24&gt;%anextras()
All Extras
All extras from the notification that are not already in one of the other variables in JSON format&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES24&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES25&gt;%angroup()
Group
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES25&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES26&gt;%anicon()
04. Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES26&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES27&gt;%anid()
Id
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES27&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES28&gt;%aninfotext()
10. Info Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES28&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES29&gt;%ankey()
Key
A unique instance key for this notification&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES29&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES30&gt;%anpackage()
Package Name
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES30&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES31&gt;%anpeople()
People
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES31&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES32&gt;%anpicture()
05. Picture
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES32&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES33&gt;%anpriority()
Priority
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES33&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES34&gt;%anprogress()
Progress
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES34&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES35&gt;%anprogressindeterminate()
Progress Indeterminate
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES35&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES36&gt;%anprogressmax()
Progress Max
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES36&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES37&gt;%anreplyaction()
20. Action Reply
Use with AutoNotification Reply&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES37&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES38&gt;%anshowchronometer()
Show Chronometer
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES38&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES39&gt;%ansortkey()
Sort Key
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES39&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES40&gt;%anstatus()
Cancelled Or Created
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES40&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES41&gt;%anstatusbaricon()
07. Status Bar Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES41&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES42&gt;%anstatusbaricon()
Status Bar Icon
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES42&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES43&gt;%ansubtext()
08. SubText
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES43&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES44&gt;%ansummary()
Is Summary
Will be set to &amp;lt;b&amp;gt;1&amp;lt;/b&amp;gt; if it's a summary and &amp;lt;b&amp;gt;will not be set&amp;lt;/b&amp;gt; otherwise.&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES44&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES45&gt;%ansummarytext()
09. Summary Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES45&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES46&gt;%antag()
Tag
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES46&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES47&gt;%antext()
03. Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES47&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES48&gt;%antextbig()
03. Text When Expanded
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES48&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES49&gt;%antextlines()
11. Text Lines
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES49&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES50&gt;%anticker()
03. Ticker Text
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES50&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES51&gt;%antitle()
02. Title
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES51&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES52&gt;%antitlebig()
02. Title When Expanded
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES52&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES53&gt;%antouchaction()
22. Action On Touch Id
Use with AutoNotification Actions&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES53&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES54&gt;%anwhen()
Show When
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES54&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES55&gt;%anwhentime()
When
&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES55&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES56&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES56&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES57&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES57&gt;&lt;/StringArray&gt;</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>InterceptPersistent QueryAppPackage plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
<plugininstanceid>3419c804-4e6a-41a5-bb81-1208c787d617</plugininstanceid>
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotificationQuery</plugintypeid>
<plugintypeid-type>java.lang.String</plugintypeid-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotificationQuery</Str>
<Int sr="arg3" val="20"/>
</Action>
<Action sr="act1" ve="7">
<code>345</code>
<label>If there is not, the variable will be empty</label>
<Int sr="arg0" val="0"/>
<Str sr="arg1" ve="3">%anapp()</Str>
<Str sr="arg2" ve="3">%isset</Str>
</Action>
<Action sr="act2" ve="7">
<code>877</code>
<label>No vpn connection. Open a new one</label>
<Str sr="arg0" ve="3">net.openvpn.openvpn.CONNECT</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3">net.openvpn.openvpn.AUTOSTART_PROFILE_NAME:YOUR_VPN_PROFILE_NAME</Str>
<Str sr="arg5" ve="3">net.openvpn.openvpn.AUTOCONNECT:true</Str>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3">net.openvpn.openvpn</Str>
<Str sr="arg8" ve="3">net.openvpn.unified.MainActivity</Str>
<Int sr="arg9" val="1"/>
<ConditionList sr="if">
<Condition sr="c0" ve="3">
<lhs>%isset</lhs>
<op>8</op>
<rhs>0</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr="act3" ve="7">
<code>877</code>
<label>Connection is active, so kill it</label>
<Str sr="arg0" ve="3">net.openvpn.openvpn.DISCONNECT</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3">net.openvpn.openvpn.STOP:true</Str>
<Str sr="arg5" ve="3"/>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3">net.openvpn.openvpn</Str>
<Str sr="arg8" ve="3">net.openvpn.unified.MainActivity</Str>
<Int sr="arg9" val="1"/>
<ConditionList sr="if">
<Condition sr="c0" ve="3">
<lhs>%isset</lhs>
<op>8</op>
<rhs>15</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr="act4" ve="7">
<code>162</code>
<label>Update the quick settings icon</label>
<Int sr="arg0" val="0"/>
<Str sr="arg1" ve="3">VPN</Str>
<Int sr="arg2" val="0"/>
<ConditionList sr="if">
<Condition sr="c0" ve="3">
<lhs>%isset</lhs>
<op>8</op>
<rhs>0</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr="act5" ve="7">
<code>162</code>
<label>Update the quick settings icon</label>
<Int sr="arg0" val="0"/>
<Str sr="arg1" ve="3">VPN</Str>
<Int sr="arg2" val="1"/>
<ConditionList sr="if">
<Condition sr="c0" ve="3">
<lhs>%isset</lhs>
<op>8</op>
<rhs>15</rhs>
</Condition>
</ConditionList>
</Action>
<Action sr="act6" ve="7">
<code>513</code>
</Action>
<Img sr="icn" ve="2">
<nme>mw_communication_vpn_key</nme>
</Img>
</Task>
</TaskerData>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment