[HOW TO] Integrate Tasker with Allo (requires root) - Tasker Tips & Tricks

I woud like to share the task I created to send commands to Allo.
The concept is very simple.
1) Insert a record on Allo's database and call the app to trigger the query.
2) Set a profile that get the notification and read the answer directly from the database.
3) Use the result to do anything you want: TTS, set a widget (Zooper, Minimalistic, etc)
It requires ROOT and Sqlite binary installed to read the database. In this case, I'm using sqlite's binary that comes with Titanium Backup (/data/data/com.keramidas.TitaniumBackup/files/sqlite3)
Before you run this task you need to set %sqlite variable with sqlite full path, also you will need enable the accessibility settings to Tasker in order to intercept the system notifications.
This task has to be called with the command as a parameter, or you can edit %text variable with your command directly
Code:
Allo - Send (152)
A1: Stop [ With Error:eek:ff Task: ] If [ %par1 !Set ]
A2: Variable Set [ Name:%text To:%par1 Do Maths:eek:ff Append:eek:ff ]
<Set SQLITE path>
A3: Variable Set [ Name:%sqlite To:/data/data/com.keramidas.TitaniumBackup/files/sqlite3 Do Maths:eek:ff Append:eek:ff ]
<Insert command into Allo database table>
A4: Run Shell [ Command:%sqlite /data/data/com.google.android.apps.fireball/databases/fireball.db "insert into messages (message_id, conversation_id, sender_id, received_timestamp, server_timestamp, message_status, seen, read_status, text, initial_insert_timestamp,type) VALUES (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-' || lower(hex(randomblob(2))) || '-' || lower(hex(randomblob(2))) || '-' || lower(hex(randomblob(6))), (SELECT _id FROM conversations WHERE participant_normalized_destination = 'google' limit 1), 1, strftime('%s000', 'now'), strftime('%s000000', 'now'), 3, 1, 1, '%text', strftime('%s000', 'now'), 2);
select last_insert_rowid() ;" Timeout (Seconds):0 Use Root:eek:n Store Output In:%out Store Errors In: Store Result In: Continue Task After Error:eek:n ]
<Store the inserted record ID into a global variable>
A5: Variable Set [ Name:%ALLO_ID To:%out Do Maths:eek:ff Append:eek:ff ]
<Launch Allo to process the command>
A6: Launch App [ App:Allo Data: Exclude From Recent Apps:eek:ff Always Start New Copy:eek:ff ]
A7: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
<This is necessary in order to receive an Allo notification with the answer>
A8: Go Home [ Page:0 ]
You will notice the global variable %ALLO_ID used to set the _id of the inserted record. You will need it later in order to recover Allo's answers.
This is a Task example to read the answer and say it by "text to speech". But you can do other automation tasks as you need.
Code:
Allo - Say (154)
A1: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A2: Variable Set [ Name:%sqlite To:/data/data/com.keramidas.TitaniumBackup/files/sqlite3 Do Maths:eek:ff Append:eek:ff ]
A3: Run Shell [ Command:%sqlite /data/data/com.google.android.apps.fireball/databases/fireball.db "select text from messages where message_id like 'R:google%' and text is not null and _id > '%ALLO_ID' ;" Timeout (Seconds):0 Use Root:eek:n Store Output In:%out Store Errors In: Store Result In: Continue Task After Error:eek:n ]
A4: If [ %out !Set ]
A5: Wait [ MS:0 Seconds:2 Minutes:0 Hours:0 Days:0 ]
A6: Run Shell [ Command:%sqlite3 /data/data/com.google.android.apps.fireball/databases/fireball.db "select text from messages where message_id like 'R:google%' and text is not null and _id > '%ALLO_ID' ;" Timeout (Seconds):0 Use Root:eek:n Store Output In:%out Store Errors In: Store Result In: Continue Task After Error:eek:n ]
A7: End If
A8: Flash [ Text:%out Long:eek:ff ]
A9: Say [ Text:%out Engine:Voice:default:default Stream:3 Pitch:4 Speed:4 Respect Audio Focus:eek:n Network:eek:ff Continue Task Immediately:eek:ff ]
Sample Project with the Tasks:
View attachment Allo.prj.xml
Share yours Allo's commands here. What would you automate with this ?

ok, this looks pretty awesome ..I'm trying to get Google spoken search results on my huawei watch and this looks promising

ok, yeah, this is super awesome .. I now have 'limited' spoken Google search results on my huawei watch ... ( I'm a junkie addicted to autovoice+wearshell+ tasker ) ...
QUESTION: spoken search results are limited because many of the answers Google Assistant provides aren't just plain text ... so, how could the notification from Allo be parsed or converted or whatever? could AutoNotifications tasker plugin accomplish this? or some other tasker plugin?
...this project is still awesome as is though wow

I have imported the Project, Tested it gives me error when I run the Say Task after running the Test Task.
I have titaniumbackup pro installed and also set fullpath to variable.
There is error on the Run Shell Action. What can I do>?
Also tested Tasker has Root by using shell action input taps.

fenchai said:
I have imported the Project, Tested it gives me error when I run the Say Task after running the Test Task.
I have titaniumbackup pro installed and also set fullpath to variable.
There is error on the Run Shell Action. What can I do>?
Also tested Tasker has Root by using shell action input taps.
Click to expand...
Click to collapse
my import worked and I DID NOT set the fullpath variable ... I also have Titanium Backup pro installed ...
try deleting the project, then back fully out of tasker, then import project again and MAKE NO CHANGES .. just run the test and see what happens

pablo71 said:
my import worked and I DID NOT set the fullpath variable ... I also have Titanium Backup pro installed ...
try deleting the project, then back fully out of tasker, then import project again and MAKE NO CHANGES .. just run the test and see what happens
Click to expand...
Click to collapse
Yeah, Did it, fully backed out twice after importing too. Gives me error on the Say Test task. Maybe its because I am using Magisk root. But I already tested Tasker has root access. Even checked superuser to make sure. Error on Both Shell Runs

fenchai said:
Maybe its because I am using Magisk root.
Click to expand...
Click to collapse
I bet you are right .. I'm still on KitKat so I don't need systemless root, but I've read in other threads that strange issues were fixed by creating the file "su" in system folder (or something like that) by using the touch command ... can't remember the threads or procedure exactly but doing that helps some apps realize root really exists (according to those users it fixed problems for) ... best of luck
Update: this breaks Android Pay but...
from this post by Chainfire:
Yes, some apps look for the su binary in hardcoded locations. SuperSU in systemless mode by default does not touch /system, but if you create /system/bin/su and/or /system/xbin/su yourself (with the above statement in mind, doing so from Recovery is probably best), it will override those files with the correct binary each boot. This should fix most misbehaving apps (that do not rely on modifying /system on a device which currently does not allow this).
and:
I haven't tested this, but from looking at the script in the SuperSU.zip file, I think you can do the following after installing systemless root:
adb shell
su
mount -o remount,rw /system
touch /sbin/su /system/bin/su /system/xbin/su
mount -o remount,ro /system
exit
I ran these commands over ADB in Recovery and lo and behold, Secure Settings works again.

pablo71 said:
ok, yeah, this is super awesome .. I now have 'limited' spoken Google search results on my huawei watch ... ( I'm a junkie addicted to autovoice+wearshell+ tasker ) ...
QUESTION: spoken search results are limited because many of the answers Google Assistant provides aren't just plain text ... so, how could the notification from Allo be parsed or converted or whatever? could AutoNotifications tasker plugin accomplish this? or some other tasker plugin?
...this project is still awesome as is though wow
Click to expand...
Click to collapse
Unfortunally several answers are not in plain text, for that reason I had to include: " and text is not null" condition to SQL I think it would be difficult to read because the answer is on BLOB fields..
I'm also an addict to Tasker/Autovoice using my MotoX voice commands..

hotsync100 said:
I'm also an addict to Tasker/Autovoice using my MotoX voice commands..
Click to expand...
Click to collapse
most excellent! .. that's the only way .. this thread explains how to get sql to read the text in BLOB fields .. http://stackoverflow.com/questions/828650/how-do-i-get-textual-contents-from-blob-in-oracle-sql I can figure it out but shucks, maybe you know a faster way to plug in the the command string to what you wrote .. I bang my head against lots of walls because i sometimes get different results

pablo71 said:
this thread explains how to get sql to read the text in BLOB fields ..
Click to expand...
Click to collapse
Unfortunally that functions are for Oracle and we are using Sqlite..
We can get the hex value of BLOB field using this command:
"select hex(blob_data) from messages where message_id like 'R:google%' and text is null limit 1"
.. but, it is huge for Tasker.. and still we have to convert it to ascii to be readable.. there is no tasks to convert it in tasker .. Only from hex to decimal.

hotsync100 said:
Unfortunally that functions are for Oracle and we are using Sqlite..
We can get the hex value of BLOB field using this command:
"select hex(blob_data) from messages where message_id like 'R:google%' and text is null limit 1"
.. but, it is huge for Tasker.. and still we have to convert it to ascii to be readable.. there is no tasks to convert it in tasker .. Only from hex to decimal.
Click to expand...
Click to collapse
ahhh ... now I get it ... we're gonna need a bigger boat

pablo71 said:
I bet you are right .. I'm still on KitKat so I don't need systemless root, but I've read in other threads that strange issues were fixed by creating the file "su" in system folder (or something like that) by using the touch command ... can't remember the threads or procedure exactly but doing that helps some apps realize root really exists (according to those users it fixed problems for) ... best of luck
Update: this breaks Android Pay but...
from this post by Chainfire:
Yes, some apps look for the su binary in hardcoded locations. SuperSU in systemless mode by default does not touch /system, but if you create /system/bin/su and/or /system/xbin/su yourself (with the above statement in mind, doing so from Recovery is probably best), it will override those files with the correct binary each boot. This should fix most misbehaving apps (that do not rely on modifying /system on a device which currently does not allow this).
and:
I haven't tested this, but from looking at the script in the SuperSU.zip file, I think you can do the following after installing systemless root:
adb shell
su
mount -o remount,rw /system
touch /sbin/su /system/bin/su /system/xbin/su
mount -o remount,ro /system
exit
I ran these commands over ADB in Recovery and lo and behold, Secure Settings works again.
Click to expand...
Click to collapse
Hi, Yeah, I have also tried it. I dont think its the systemless method. Maybe its android 6.0. We would need more people to confirm.

@pablo71 I found a way to convert hex to ascii using Javascript ..
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
but unfortunally there is not much text on results..

hotsync100 said:
@pablo71 I found a way to convert hex to ascii using Javascript ..
View attachment 3906968
but unfortunally there is not much text on results..
View attachment 3906969 View attachment 3906967
Click to expand...
Click to collapse
you're amazing! this is a start!

This is a Task example to get data for a BLOB field..
View attachment Allo___Blob.tsk.xml

fenchai said:
Hi, Yeah, I have also tried it. I dont think its the systemless method. Maybe its android 6.0. We would need more people to confirm.
Click to expand...
Click to collapse
I think this is not related with Android 6.0, because my MotoX has that version and works fine!

hotsync100 said:
This is a Task example to get data for a BLOB field..
View attachment 3907008
Click to expand...
Click to collapse
hey this so appreciated .. I'm gonna be off work in an hour and I'm gonna plug this as soon as I get home ... this is really cool!!! Having this feature on my watch is going to be so much faster than pulling out my phone and talking into it or typing on it
3 hours later: I think I'm seeing some ways tasker could use variable splitters and search/replace actions to extract useful text .. this looks pretty promising

Hi, i don't really get android shells commands, so i would like to know if we can send a message with this?
Regards,

How empty variable from sqlite?

I've developed new appreciation for this project the past couple months, and I've been using it more and more often to get spoken Google Results on my watch ... I've learned to stick with simple questions using precise words and I'm happy with the results! (how old is George Lucas, how many original star trek episodes were there, what is the deepest point in the Pacific ocean, etc )... I still haven't found a good way to extract text from the blob fields, BUT THIS PROJECT PRODUCES RESULTS! ... it's good enough as is ... GREAT WORK!!

Related

run shell: input tap not working anymore?

Hey everyone,
Since updating to Marshmallow, I seem to have lost the functionality of
Code:
run shell input tap
Anyone else have this issue (and hopefully a solution?)
ps: I checked the "use root" box
supermooshman said:
Hey everyone,
Since updating to Marshmallow, I seem to have lost the functionality of
Code:
run shell input tap
Anyone else have this issue (and hopefully a solution?)
ps: I checked the "use root" box
Click to expand...
Click to collapse
Add this line above your input tap, so the whole script is:
su -cn u:r:system_app:s0
input tap 1425 1350
Edit: requires busybox to be correctly installed, I believe.
Sent from my SM-G928F using Tapatalk
RuggedHunter said:
Add this line above your input tap, so the whole script is:
su -cn u:r:system_app:s0
input tap 1425 1350
Edit: requires busybox to be correctly installed, I believe.
Sent from my SM-G928F using Tapatalk
Click to expand...
Click to collapse
My setup is
A3: Launch App [ App:Location Data: Exclude From Recent Apps: off ]
A4: Run Shell [ Command:input tap 1300 447 Timeout (Seconds):1 Use Root: on
A5: Run Shell [ Command:input tap 650 705 Timeout (Seconds):1 Use Root: on
A6: Run Shell [ Command:input tap 570 830 Timeout (Seconds):1 Use Root: on
all works except the A6 . cant seems to make it work, what I am doing wrong
Try adding a wait command between the taps. Something like 300ms should suffice.
Sent from my HTC One using Tapatalk
RuggedHunter said:
Add this line above your input tap, so the whole script is:
su -cn u:r:system_app:s0
input tap 1425 1350
Click to expand...
Click to collapse
I don't know what that first line means but it does the trick beautifully.
Thanks
That crazy su -cn u:r:system worked for me too! hot dog! THANKS!

Copy only modified files in s folder?

I have a folder and I want to only copy the files in it to a different folder, there are other folders in it that I do not want to copy. The files have various extensions and some have none. I can copy the whole folder but that will also sub the other folders in it, I am not sure how to do this.
Use a list files action to create a variable with everything (files and directories) in the directory you want to copy files from:
Code:
A1: List Files [
Dir: Download
Match:
Include Hidden Files: Off
Use Root: Off
Sort Select: Alphabetic
Variable: %testfiles
]
Then open FOR loop so you can act on each item in the variable created above:
Code:
A2: For [
Variable: %testfile
Items: %testfiles()
]
Now test to see if you're dealing with a file or not:
Code:
A3: Test File [
Type:Type
Data: %testfile
Store Result In: %test
Use Root: Off
]
If the entry tests as a file, copy it to the new location:
Code:
A4: Copy File [
From: %testfile
To: test/
Use Root: Off
] If [ %test ~ file ]
End the FOR loop:
Code:
A5: End For
"Good judgment comes from experience, and a lot of that comes from bad judgment." - Will Rogers

Tasker can't delete root folders...

Hi everyone I'm trying to make a task which will delete a folder in /system/app/ folder but Tasker always gives me error 1 when I try to perform action. I already tried to mount /system rw with Tasker remount action but didn't helped. Also Tasker's file explorer seems like can't see root folders so I have to write path manually so I think it's may be Tasker related problem and I give every permission Tasker asks for solve this but not worked. It's already have root, modify system, usage access permissions.
Running Android 8.1 LOS 15.1
Here is the error log;
Code:
08.30.27/FileUtil nrda: need request: /system/app/BasicDreams: false
08.30.27/E checkSDPath: /system/app/BasicDreams useRoot: true there: true file: false dir: true
08.30.27/E Delete Directory: checkSDPath: /system/app/BasicDreams useDocFile: false
08.30.27/Shell runSync test -e '/system/app/BasicDreams' root: true timeout: 3000
08.30.27/Shell have process
08.30.27/Shell write cmd: test -e '/system/app/BasicDreams'
08.30.27/Shell start process timeout timer 3000ms for: test -e '/system/app/BasicDreams'
08.30.27/Shell start process-thread ID 559
08.30.27/Shell joined with 559
08.30.27/Shell exit result: 0
08.30.27/Shell non-null timeout
08.30.27/Shell runSync test -f '/system/app/BasicDreams' root: true timeout: 3000
08.30.27/Shell have process
08.30.27/Shell write cmd: test -f '/system/app/BasicDreams'
08.30.27/Shell start process timeout timer 3000ms for: test -f '/system/app/BasicDreams'
08.30.27/Shell start process-thread ID 561
08.30.27/Shell joined with 561
08.30.27/Shell exit result: 1
08.30.27/Shell non-null timeout
08.30.27/Shell runSync test -d '/system/app/BasicDreams' root: true timeout: 3000
08.30.27/Shell have process
08.30.27/Shell write cmd: test -d '/system/app/BasicDreams'
08.30.27/Shell start process timeout timer 3000ms for: test -d '/system/app/BasicDreams'
08.30.27/Shell start process-thread ID 563
08.30.27/Shell joined with 563
08.30.27/Shell exit result: 0
08.30.27/Shell non-null timeout
08.30.27/E Delete Directory: checkSDPath: /system/app/BasicDreams ok true
08.30.27/Shell runSync rm -r -f '/system/app/BasicDreams' root: true timeout: 7000
08.30.27/Shell have process
08.30.27/Shell write cmd: rm -r -f '/system/app/BasicDreams'
08.30.27/Shell start process timeout timer 7000ms for: rm -r -f '/system/app/BasicDreams'
08.30.27/Shell start process-thread ID 565
08.30.27/Shell joined with 565
08.30.27/Shell exit result: 1
08.30.27/Shell non-null timeout
08.30.27/E One or more failures deleting /system/app/BasicDreams.
08.30.27/E result: stop task (error)
08.30.27/E Error: 1
08.30.27/MacroEdit action finished exeID 1 action no 5 code 408 status: Err next 5
Could you export and post the description (not XML) of the task foot this please.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
ktmom said:
Could you export and post the description (not XML) of the task foot this please.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
Click to expand...
Click to collapse
Code:
Do Stuff (52)
A1: Flash [ Text:Mounting /system rewritable... Long:eek:ff ]
A2: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A3: Remount [ Path:/system Writeable:eek:n ]
A4: Flash [ Text:Deleting files and directories... Long:eek:n ]
A5: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A6: Delete Directory [ Dir:/system/app/BasicDreams Recurse:eek:n Use Root:eek:n ] [I]ERROR HAPPENS AT THIS ACTION[/I]
A7: Delete Directory [ Dir:/system/app/Calendar Recurse:eek:n Use Root:eek:n ]
A8: Delete Directory [ Dir:/system/app/Email Recurse:eek:n Use Root:eek:n ]
A9: Delete Directory [ Dir:/system/app/Jelly Recurse:eek:n Use Root:eek:n ]
A10: Delete Directory [ Dir:/system/app/LatinIME Recurse:eek:n Use Root:eek:n ]
A11: Delete Directory [ Dir:/system/app/messaging Recurse:eek:n Use Root:eek:n ]
A12: Delete Directory [ Dir:/system/app/PhotoTable Recurse:eek:n Use Root:eek:n ]
A13: Delete Directory [ Dir:/system/app/webview Recurse:eek:n Use Root:eek:n ]
A14: Delete Directory [ Dir:/system/priv-app/AudioFX Recurse:eek:n Use Root:eek:n ]
A15: Delete Directory [ Dir:/system/priv-app/Contacts Recurse:eek:n Use Root:eek:n ]
A16: Delete File [ File:/system/priv-app/Dialer/Dialer.apk Shred Level:0 Use Root:eek:n ]
A17: Delete Directory [ Dir:/system/priv-app/Eleven Recurse:eek:n Use Root:eek:n ]
A18: Delete Directory [ Dir:/system/priv-app/Gallery2 Recurse:eek:n Use Root:eek:n ]
A19: Delete Directory [ Dir:/system/priv-app/Snap Recurse:eek:n Use Root:eek:n ]
A20: Delete Directory [ Dir:/system/priv-app/Trebuchet Recurse:eek:n Use Root:eek:n ]
A21: Flash [ Text:Copying files... Long:eek:n ]
A22: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A23: Copy File [ From:Chandler Muriel Bing/Portbag/Google Phone v23.0.apk To:/system/priv-app/Dialer/Dialer.apk Use Root:eek:n ]
A24: Copy File [ From:Chandler Muriel Bing/Portbag/MIUI 9.5 Ringtones/Mi.ogg To:/system/media/audio/ringtones/ Use Root:eek:n ]
A25: Copy File [ From:Chandler Muriel Bing/Portbag/MIUI 9.5 Ringtones/Mi.ogg To:/system/media/audio/alarms/ Use Root:eek:n ]
A26: Copy File [ From:Chandler Muriel Bing/Portbag/MIUI 9.5 Ringtones/Fresh.ogg To:/system/media/audio/notifications/ Use Root:eek:n ]
A27: Copy File [ From:Chandler Muriel Bing/myDevice/LOS/bootanimation.zip To:/system/media/ Use Root:eek:n ]
A28: Flash [ Text:Setting permissions... Long:eek:n ]
A29: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A30: Run Shell [ Command:chmod 644 /system/priv-app/Dialer/Dialer.apk Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
A31: Run Shell [ Command:chmod 644 /system/media/alarms/Mi.ogg Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
A32: Run Shell [ Command:chmod 644 /system/media/ringtones/Mi.ogg Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
A33: Run Shell [ Command:chmod 644 /system/media/notifications/Fresh.ogg Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
A34: Run Shell [ Command:chmod 644 /system/media/bootanimation.zip Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
A35: Flash [ Text:Mounting /system read-only... Long:eek:n ]
A36: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A37: Remount [ Path:/system Writeable:eek:ff ]
A38: Flash [ Text:Rebooting... Long:eek:n ]
A39: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ]
A40: Run Shell [ Command:reboot Timeout (Seconds):0 Use Root:eek:n Store Output In: Store Errors In: Store Result In: ]
OK, I can run that exactly as written without trouble on my device (not running on LOS).
What root are you using? LOS superuser or Magisk?
I don't think it's an SELinux enforcing issue because I am enforcing and it works. But, you could try setting SELinux to permissive just to test. Run a shell action as root "setenforce 0" for permissive and "setenforce 1" for enforcing. If you want to flash which mode you are in, use a shell action: "getenforce" as root and make sure to assign a variable to the "store output in" field. Then flash that variable. It will return enforcing or permissive.
My last thought is to try the command in a terminal and see if there is any enlightenment as a result.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
ktmom said:
OK, I can run that exactly as written without trouble on my device (not running on LOS).
What root are you using? LOS superuser or Magisk?
I don't think it's an SELinux enforcing issue because I am enforcing and it works. But, you could try setting SELinux to permissive just to test. Run a shell action as root "setenforce 0" for permissive and "setenforce 1" for enforcing. If you want to flash which mode you are in, use a shell action: "getenforce" as root and make sure to assign a variable to the "store output in" field. Then flash that variable. It will return enforcing or permissive.
My last thought is to try the command in a terminal and see if there is any enlightenment as a result.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
Click to expand...
Click to collapse
I'm using Magisk v17.1 and I don't think this issue is root related, but I'm gonna try SELinux mode and post result here thanks!
SELinux didn't worked... But I assume I found issue issue is Tasker can't mount system rw, for test it I used terminal and type command; "mount -o rw,remount /system" command worked without error then write that command; "rm /system/app/BasicDreams/BasicDreams.apk" terminal asks yes or no typed y and gived error read-only system...
I'm not familiar with LOS, but it's possible the boot.img (kernel) doesn't permit remount. Maybe someone in your rom thread could help.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
ktmom said:
I'm not familiar with LOS, but it's possible the boot.img (kernel) doesn't permit remount. Maybe someone in your rom thread could help.
"find somebody that you think is undeserving of your compassion and give it to them" - Christian Picciolini
Click to expand...
Click to collapse
Actually I think I solved this, there is a system mirror folder in /sbin/.core/mirror/ which contains exact same files on /system/ so I tried to create a file there and it's created on /system/ too and deleted it guess what? IT'S DELETED ON /system/ TOO so I changed every action on Tasker to /sbin/. core/mirror/system/... and worked! So like you said before it's related with Magisk's systemless specification. Thanks again ?
Now Tasker can't change /sbin folder too ?

creating my 1st module: but service.sh never run

Magisk v19.3 on lineageos 16.0 for wt86047
trying to create my first module, no files to replace, just one task: run a remove.sh script
I put following two lines in ./common/service.sh , but there's no file created after boot , seems the service.sh itself never be run at all.
echo -e "\n------------${MODPATH}----------------------------" >> /sdcard/s.txt >&1
sh ./remove.sh
LATESTARTSERVICE=true in ./install.sh --YES
./META-INF/com/google/android/update-binary updated --YES
./module.prop edited --YES
the module installed with no error --YES
manual run remove.sh successfully in terminal after reboot --YES
called from service.sh --NO
need help, THANK YOU!
attached remove.sh
Code:
#!/system/bin/sh
DIRFILE="/sdcard/dir"
if [ -f "$USRFILE" ];then
while IFS= read -r LINE
do
if [ -n "${LINE}" ];then
...
...
fi
I haven't looked at what might be your issue, but you don't need a module for that... Just place your remove.sh script in /data/adb/service.d and give it execution permission.
Didgeridoohan said:
I haven't looked at what might be your issue, but you don't need a module for that... Just place your remove.sh script in /data/adb/service.d and give it execution permission.
Click to expand...
Click to collapse
thanks. but it doesn't work either.
When I manually run the script from terminal, it prompt 'Permission denied.'
But it works after execute 'su' first.
Is this the reason? But how could I authorise root right to the script since it doesn't pop dialogbox at all.
Again, I haven't looked at your script at all, but...
Any scripts run by Magisk at boot will run with superuser permission. That's not your issue...
Might be that the script has to run after boot is completed (if it works while booted but not during boot). You can look for the sys.boot_completed and when it's changed to 1 you can let the script execute.
I use this code in my modules, if it can help
Code:
_SLEEPBOOT=60
# ...
RETRY_INTERVAL=${_SLEEPBOOT} #in seconds
MAX_RETRY=30
retry=${MAX_RETRY}
while (("$retry" > "0")) && [ "$(getprop sys.boot_completed)" != "1" ]; do
sleep ${RETRY_INTERVAL}
((retry--))
done
Didgeridoohan said:
Again, I haven't looked at your script at all, but...
Any scripts run by Magisk at boot will run with superuser permission. That's not your issue...
Might be that the script has to run after boot is completed (if it works while booted but not during boot). You can look for the sys.boot_completed and when it's changed to 1 you can let the script execute.
Click to expand...
Click to collapse
Code:
# Wait for boot to complete
until [ "$(getprop sys.boot_completed)" ]
do
sleep 2
done
insert this code to script but still not work...
after all, found the solution:
don't use '/sdcard/, use '/storage/emulated/0/' instead, don't know why
funnypc said:
Code:
# Wait for boot to complete
until [ "$(getprop sys.boot_completed)" ]
do
sleep 2
done
insert this code to script but still not work...
after all, found the solution:
don't use '/sdcard/, use '/storage/emulated/0/' instead, don't know why
Click to expand...
Click to collapse
Might have worked if you had checked for sys.boot_completed = 1.
But yeah, /sdcard isn't available during boot. To be even more sure it'll work you could use /data/media/0 instead. That's always available (as long as /data is accessible).
Didgeridoohan said:
Might have worked if you had checked for sys.boot_completed = 1.
But yeah, /sdcard isn't available during boot. To be even more sure it'll work you could use /data/media/0 instead. That's always available (as long as /data is accessible).
Click to expand...
Click to collapse
though the script can work alone , I still want make it a module so that could install/disable easier with magisk gui than terminal.
currently I'm add a 'bypass' mode while script load, if volume key pressed repeatly. (like xposed does) but the code can only work after unlock, it seems the getevent can't work after system reboot, before keyguard unlocked. any workaround? thx!
Code:
#!/system/bin/sh
KEYSTRING="KEY_VOLUME"
KEYREPEAT=1
KEYCOUNTS=0
until [ "$(getprop sys.boot_completed)" ]
do
sleep 2
done
setenforce Permissive
echo 300 > /sys/class/timed_output/vibrator/enable
sleep 0.3
for i in `seq 1 4`;
do
EVENT=$(timeout 1 getevent -l -q -c 1)
RESULT=`echo $EVENT | grep -c $KEYSTRING`
input keyevent mouse
if [ "$RESULT" -gt 0 ] ;then
KEYCOUNTS=`expr $KEYCOUNTS + $RESULT`
echo 100 > /sys/class/timed_output/vibrator/enable
fi
done
if [ "$KEYCOUNTS" -gt "$KEYREPEAT" ] ;then
echo 1000 > /sys/class/timed_output/vibrator/enable
fi
Simple, just put your code in the service.sh file of the module instead of a separate script file...
Didgeridoohan said:
Simple, just put your code in the service.sh file of the module instead of a separate script file...
Click to expand...
Click to collapse
can't work. so I put the keypress detection part in a standalone script for debug. just script in service.d folder, not pack to module yet.
if I run the script manually in terminal after keyguard unlocked, everything works as I want
but not when keyguard locked status just after reboot.
funnypc said:
can't work. so I put the keypress detection part in a standalone script for debug. just script in service.d folder, not pack to module yet.
if I run the script manually in terminal after keyguard unlocked, everything works as I want
but not when keyguard locked status just after reboot.
Click to expand...
Click to collapse
I mean the code from your remove.sh file, not the key detecting stuff... That way you can disable the module from the Manager and also from TWRP (or other custom recovery) by placing a disable file in the module directory or enabling Magisk Core Only Mode by placing a .disable_magisk file in /cache.

My lightweight Debian Desktop

People generally have a hard time accepting change, understanding new things. It's too bad. THing is, people want things to operate by the parameters they have set instead of accepting what a thing is. Take Linux - people come from elsewhere, sit at a linux box, and lose their minds. Tha's the wrong atitude, of course it's a failure. You don't make toast with a radio.
Linux is a vast collection of stuff. There are many ways to set it up, configure it, many apps that do the one thing. It's a big deal and it's probably too much awesome for most. If your attitude going in is open, and you have no dogma or prejudice, before yuo know it you'll wonder why you suffered anything else for so long.
All that said - I run Debian since forever and I run a lightweight config. I don't use a 'desktop environment' like KDE or Gnome (say g-nome one time standing next to me....fuk'n...) because I don't need or want all that it includes. You might and that's cool. THis ain't for you, though. I'm not gonna hold your hand, but, this is easy to follow, it's basically right in front of you.
If you'd like to enjoy a similar desktop as I do then browse through one time and then get yourself ready. It doesn't take long at all and it's damned easy.
We'll use the net-installer iso because that's all we need and we have an internet connection. If you're not on a pipe, you can't do things this way. We will use the 64 bit net-install iso that includes non-free firmware so your wireless will work during installation. Here. To burn this to a usb stick on windows - go find an app for that. On Linux, use dd:
sudo dd if=firmware-11.2.0-amd64-netinst.iso of=/dev/sdc status="progress"
You can see from the command that my usb stick is /dev/sdc - this is the 'device' it is. It's important to get this right, dd don't care and will wipe whatever drive you put here. Make sure your usb stick is /dev/sdc or /dev/sdb. sudo fdisk -l will tell you, gparted will tell you. Whatever it is...After it's on the stick, reboot to it.
Debian install ain't pretty, but, it's fast and easy. You're gonna hit enter a lot. Chose a hostname, but, don't worry about a domain name in the next screen. If you have one, use it, if you don't, just leave it empty and go next.
Create a root user, this ain't ubuntu. Create your user next...
Partitioning is up to you, you can let debian do its thing with the default - guided (bye bye existing data), or, you can arrow down to manual, which is the right choice - I always use 4 primaries:
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
all formatted ext4 (use as). I use a swap for hibernation, you don't really need it if you have over 4gb ram. Make one, anyway. Make swap at least 2ce your ram. My /root (sda3) partition is so large because I used to run a web server. You can make /root much smaller, say 50gb and put the rest into /home.
If you have data in your /home partition already - what are you doing here - then you can choose to keep it during partitioning. The installer will default to keep, so you're good. You have to tell it to erase the partition, for example in your /boot. You can use other drives or not during the installation, too. You may have a /dev/sdb drive in your box, maybe it's a dump. When you are partitioning you can enter on it and choose to use it or not - use as: ext4, or whatever. Just choose custom for the mount point and type in a name. /stuff... Make sure to make your /boot partition 'bootable' when you are partitioning. You will see it as a choice when you partition.
Your next real decision in the installer is choosing what to install. The installer defaults to: desktop environment, gnome, and at the bottom, standard system utilities. For our purposes, uncheck (arrow key and spacebar) everything except the bottom one, go next...The installer will install some basic tools and whatnot, maybe a hundred or so files. That's it, go next...keep going through the install, mostly hitting enter. Participate in popularity contest or not - hint: Debian doesn't care about you like facebook does, you're not selling your soul if you participate. It defaults to no, though, choose what you want and next...
Install that grub boot loader on your /dev/sda drive. You'll see drive choices when it asks you. Enter on your choice. In a second you will reboot into the vast blackness of a barebones debian install. Wicked.
It's installed and you can grow from here. On the one laptop I have pi-hole installed on - I did nothing else after this barebones install other than install pi-hole. It put dependencies on for me, lighttpd for example and supporting php. That laptop stays on foever and I ssh in if I need to. It's an appliance. For you, you want a desktop, you want programs and whatnot so you can do stuff.
Upon booting you'll land at a login prompt. Log in as root the one time. run: apt install aptitude xorg scrot lxrandr lxappearance openbox feh gpicview unclutter numlockx thunar xinit lxpanel sudo xfce4-terminal, hit enter. When it's finished, run this: visudo, enter. Scroll down to beneath the root user entry and type:
YOURUSERNAME ALL=(ALL:ALL) NOPASSWD:ALL, then, ctrl+x, y, enter.
You've just made yourself admin on the box without having to input a password ever again. Handy. log out from root, type: exit, hit enter.
As it stands now, you can log into a pretty gui desktop right now, so, let's do it. Remember, there's not much installed and we didn't config anything yet. You just have xorg for your display, openbox for window management a panel, a file manager, init, a terminal, and I like aptitude (package management) because I made .bash_aliases entries for it ages ago.
Log in as you. Your prompt might change color, don't worry if it doesn't. You're still logged into just that empty blackness because we didn't start anything yet. Let's do that. Do this first: nano .xinitrc, enter. In that file add this line: exec openbox-session, then save and close (ctrl+x, y, enter). Now, start the pretty by typing: startx, and hit enter.
Bam. You're in more emptiness. This is openbox and you know you're in something because if you right-click (right-click on all of the things) you will see a small menu. Now, this ain't KDE, remember, this is a fleet-footed light desktop and openbox is a window manager, because, that's all you need - the luxury we get we create, this is custom. I don't install too much because I'm just a commoner now, no web development, no audio/video stuff (well, a little) I don't need writing, research , project support anymore, or, anything, really. You might, though, and debian has it all - add your fancy stuff later, let's get openbox and the desktop useable and fancy first.
In linux, everything is a file. Everything, even your devices. That's so cool. OPenbox uses 3 files for configuration, to let you do stuff. rc.xml controls your fancy keyboard combos, menu.xml created and maintains your desktop menu, and autostart.sh does what it says. You can learn and try things as you go, but, for now, we want to edit autostart.sh. Do it: nano .config/openbox/autostart.sh, enter. I have only a few entries which are:
sh ~/.fehbg &
redshift &
lxpolkit &
numlockx &
lxpanel &
compton -bcC &
thunar --daemon &
xscreensaver -no-splash &
#------------------------------------------////
# Delayed Startup Handiness:
#------------------------------------------////
(sleep 2s && unclutter) &
(sleep 3s && volumeicon) &
(sleep 3s && diodon) &
See that first entry - feh? That's a script to tell feh what to present as my desktop background image. Here's the script:
#!/bin/sh
feh --no-fehbg --bg-fill '~/nick/nick-nazzaro-jungle-green.png'
The autostart entry is running the script from my home directory (~/). So, make the file for the script in your home directory (nano .FILENAME, enter). You can see from the autostart entry that my script is saved as .fehbg. Call it whatever you want, just make the file and after you save it, you'll need to make it executable so it will run, do, do this: chmod +x .fehbg, enter. DOn't forget to change the directory feh serves up the image from. You don't have an image in ~/nick... I also use a handy thunar action for the desktop background where I can right-click on any image and set it as the background and the feh script will update to the new choice. Handy.
You'll notice my autostart file has entries we didn't install yet. I'll tell you: redshift reduces the blue when it's dark, numlockx chooses it for you so when you log in you can use your number keys, lxpanel gives me a panel with a tray, compton makes things prettier, thunar is the file manager that you don't have to autolaunch as a daemon at all if you don't want to, xscreensaver does what it says. The entries with sleep are delayed for x seconds: unclutter makes the mouse disappear after 10 seconds - handy, volumeicon gives me mixer access in the panel, and diodon replaces clipit as a clipboard manager. Add whatever program or script that you want to autostart with your desktop.
I have a bunch of entries in the rc.xml file becasue hitting a key-combo is handy. For example I hit win+b to open firefox, win+t for the terminal, and so on. Here is the syntax:
<keybind key="W-b">
<action name="Execute">
<execute>~/Downloads/firefox/firefox</execute>
</action>
</keybind>
I make an entry for screenshots, too, because wtf - I can't be bothered to go clicking for an app when I want one. Most times, the print (screen) button is already employed as a handy full desktop screenshot. But, we are barebones here, no DE that will do that for us. I use scrot because it's magic and awesome. I have entries in rc.xml for key-combos, and I have antries in the menu.xml file as well, should I feel like clicking. IN rc.xml my scrot entries are as follows (yes, I had to make the folder 'scrots' in my ~/. Get used to knowing, and using this: ~/, as /home/YOU/
<!--SCROT-->
<keybind key="W-Print">
<action name="Execute">
<execute>scrot '%Y-%m-%d_$wx$h_%X.jpg' -s -e 'mv $f ~/scrots/ & gpicview ~/scrots/$f'</execute>
</action>
</keybind>
<keybind key="W-Insert">
<action name="Execute">
<execute>scrot '%Y-%m-%d_$wx$h_%X.jpg' -e 'mv $f ~/scrots/'</execute>
</action>
</keybind>
<keybind key="Print">
<action name="Execute">
<execute>scrot '%Y-%m-%d--%s_$wx$h_scrot.jpg' -e 'mv $f ~/scrots/ & gpicview ~/scrots/$f'</execute>
</action>
</keybind>
<!--END SCROT-->
The menu.xml file is just as simple. You can use a tool to make the menu for you, in fact there are a few, but, I don't mess with those. Have a look at one of my sub-menus:
<menu id="stuff" label="Utils" icon="/usr/share/icons/Tango/scalable/apps/system-config-users.svg">
<item label="Audio Settings" icon="/usr/share/icons/Tango/scalable/devices/stock_mic.svg">
<action name="Execute">
<command>pavucontrol</command>
</action>
</item>
<item label="Screensaver" icon="/usr/share/icons/Tango/scalable/apps/gnome-settings-accessibility-technologies.svg">
<action name="Execute">
<execute>
xscreensaver-demo
</execute>
</action>
</item>
<item icon="/usr/share/icons/Tango/scalable/apps/internet-web-browser.svg" label="Bleachbit-root" icon="/usr/share/icons/bleachbit.png">
<action name="Execute">
<execute>
<!-- su-to-root -X -c bleachbit -->
sudo bleachbit
</execute>
</action>
</item>
<item icon="/usr/share/icons/Tango/scalable/apps/utilities-system-monitor.svg" label="GParted" icon="/usr/share/icons/gparted.png">
<action name="Execute">
<execute>
sudo gparted
</execute>
</action>
</item>
<item label="Synaptic" icon="/usr/share/icons/Tango/scalable/apps/preferences-desktop-remote-desktop.svg">
<action name="Execute">
<execute>
sudo synaptic
</execute>
</action>
</item>
<item label="SystemProfiler" icon="/usr/share/icons/Tango/scalable/status/info.svg">
<action name="Execute">
<execute>
sudo hardinfo
</execute>
</action>
</item>
<item label="Timer" icon="/usr/share/icons/Tango/scalable/status/gnome-fs-loading-icon.svg">
<action name="Execute">
<execute>
~/bin/timer.sh
</execute>
</action>
</item>
</menu>
Openbox is pretty easy to set up and it's fast. I have used it for 15 years or so and never missed any fancy desktop environment. It's important to know that I support this lightweight install with ancillary procedures. For example, I employ .bash_aliases to a large degree, as, I am sure most linux users do, or, would, if they knew about it. I also employ a bunch of actions I can run on files and folders in Thunar. It's wicked.
Some entries in my ~/.bash_aliases file, for handiness:
alias 53='sudo lsof -i :53' (what's running on port 53, I have this one on the pi-hole box)
alias clients='sudo nmap -sn 192.168.1.0/24' (clients on my lan)
alias guts='sudo inxi -Fx -c24' (system hardware whatnot)
alias dim='redshift -O 4200K -r -P' (to take care of my eyes if I didn't set redshift up for auto)
alias nap='sudo /usr/sbin/pm-suspend' (to suspend my box when I leave for work, you can use systemctl)
alias again='sudo shutdown -r now' (reboot right now)
alias off='sudo shutdown -h now' (shutdown right now)
--package management --
alias sources='sudo nano /etc/apt/sources.list'
alias show='aptitude show'
alias list='dpkg -L'
alias cpf='sudo aptitude clean && sudo aptitude purge ~c && sudo aptitude -f install'
alias remove='sudo aptitude purge'
alias install='sudo aptitude --without-recommends install'
alias apps='sudo synaptic'
alias search='aptitude search'
alias update='sudo aptitude update'
alias upgrade='sudo aptitude full-upgrade'
alias orphans='sudo deborphan'
alias foster='sudo debfoster'
alias devs="aptitude -F '%p' search '~i -dev$'"
alias devsizes="aptitude -F '%I %p' search '~i -dev$'"
alias hold='sudo aptitude hold'
alias unhold='sudo aptitude unhold'
ssh to my pi box:
alias pi='ssh -p 22061 [email protected]' - I use a key, so, it's - BAM!
shut off the screen saver so I can watch a flick:
alias killx='killall -15 xscreensaver'
quick password:
alias pwgen='pwgen -ys 24 1'
when I'm in a terminal I might want to edit one of the openbox files:
alias auto='geany ~/.config/openbox/autostart.sh &'
alias menu='geany ~/.config/openbox/menu.xml &'
alias rc='geany ~/.config/openbox/rc.xml &'
I have lots more, some entries run an app, a script, do a thing. aliases are so handy.
Here are a couple entries from my thunar custom actions file (uac.xml I think in .config/thunar)
name: resize 640
command: ~/.config/scripts/resize 640 %N (that is a script)
appearance conditions (*) : image file,
Have ffmpeg installed. The script is:
Code:
#!/bin/bash
mkdir -p ./Resized/$1
for file
do
if [ ! -e "$file" ]
then
continue
fi
name=$( echo $file | cut -f1 -d.)
convert -geometry $1x$1 -quality 100 $file ./Resized/$1/${name}_$1.jpg
done
I use another one for resize, too, that's wicked. You can choose any size you want, check it out:
in thunar custom actions -
name: resize-options
command: ~/.config/scripts/resz %N
appearance conditions (*): images
Here's the resz script:
Code:
#!/bin/bash
# resize_img.sh -- An Imagemagick Resize Script
# Author: canci <[email protected]>
# License: GPL. See http://www.gnu.org/licenses/gpl.html
# Dependencies: Bash (duh!), Imagemagick, zenity
# 1. IFS and other delcarations
# Saving the old one
SAVEIFS=$IFS
# Declaring the new one
IFS=$(echo -en "\n\b")
# Files
FILES=`ls -1 [email protected]`
# Directory name in case files are not being overwritten
NEW_DIR=RESIZED__`date +%d-%b-%Y_%T`
# Integer file count for the progress bar
n=1
# 2. Get desired resolution; Exit if cancel button pressed, otherwise move on
RES=`zenity --title="Please enter a resoultion" --entry --text="Image Resizer -- Please enter a resoultion (e.g. 800x600)"`
if [ $? == 1 ]; then
exit
else
# 2.1. Should the resize disregard the current aspect ratio and resize strictly to the given resolution?
#
Q1=`zenity --title="Disregard aspect ratio?" --question --text="Disregard aspect ratio? If Yes, the images will be resized to the exact resolution you provided, which might skew images if the aspect ratio differs. If No, the aspect ratio will be preserved and only the width will be resized accurately."`
if [ $? == 0 ]; then
# 2.1.1. Should the file be overridden or should a new one be created? mogrify or convert will be used accordingly.
#
Q2=`zenity --title="Overwrite file?" --question --text="Overwrite file? If No, the resized images will be put inside a new directory called RESIZED with the date of creation appended to it."`
if [ $? == 0 ]; then
for f in $FILES
do
mogrify -resize `echo $RES`! $f
echo $n
echo "# Processing file: $f"
let "n = n+1"
done | (zenity --progress --title "Resizing..." --percentage=0 --auto-close --auto-kill)
zenity --info --text="Done!"
else
mkdir $NEW_DIR
for f in $FILES
do
convert -resize `echo $RES`! $f $NEW_DIR/$f
echo $n
echo "# Processing file: $f"
let "n = n+1"
done | (zenity --progress --title "Resizing..." --percentage=0 --auto-close --auto-kill)
zenity --info --text="Done!"
fi
# WHAT ELSE? HUH?
else
# 2.1.2. Same as in 2.1.1., but for aspect ratio resize.
#
Q3=`zenity --title="Overwrite file?" --question --text="Overwrite file? If No, the resized images will be put inside a new directory called RESIZED with the date of creation appended to it."`
if [ $? == 0 ]; then
for f in $FILES
do
mogrify -resize $RES $f
echo $n
echo "# Processing file: $f"
let "n = n+1"
done | (zenity --progress --title "Resizing..." --percentage=0 --auto-close --auto-kill)
zenity --info --text="Done!"
else
mkdir $NEW_DIR
for f in $FILES
do
convert -resize $RES $f $NEW_DIR/$f
echo $n
echo "# Processing file: $f"
let "n = n+1"
done | (zenity --progress --title "Resizing..." --percentage=0 --auto-close --auto-kill)
zenity --info --text="Done!"
fi
# Ending 2.1.
fi
# Ending 2
fi
# 3. Restore IFS (for possible future use)
#
IFS=$SAVEIFS
# EOF
exit 0
If you need a handy image resize script, that one is awesome. Put it into a file and make a custom action out of it in thunar, see how awesome it is.
There are so many more from encrypting stuff to flattening folders to mounting an iso..look them up and get some, so handy. Here's that handy right-click desktop wallpaper custom action for thunar:
command: feh --bg-fill %f
appearance conditions: image
You can see where I take advantage of built-in functionality of the system and some apps I choose in order to run and thrive in a lightweight desktop. Of course, I have a bunch of other programs installed: claws-mail, gimp, filezilla - tons of stuf. Actually not, I have 1326 packages installed. People that run with a DE will typically have 2500 packages installed. Debian has 60,000 packages from you to choose from, all config'd for the version release at the time, everything in the bullseye repos will work on your bullseye install.
My desktop is setup for the efficiency, or lack thereof, in which I function - in which I work, move. I like to use the keyboard, I like to use a terminal, I like having shortcuts and some auto stuff. I don't like introducing 19 programs to my machine to get a thing done, I don't jump on the next big app that needs 900 files installed to get it to work. I use what works and if I have to, I adapt myself to it.
The first sentence "People generally have a hard time accepting change, understanding new things. It's too bad. " Made me start laughing so hard my wife had to pause the tv. It's so true. I wanted to thank you for this amazing guide and read haha. I don't roll linux yet but I read the whole guide because your humor is a treat and have bookmarked this for when I do. Have a good day!
Rock ON, man! When/if you do take a poke at linux, I hope this write-up can be helpful. It's definitely not for eveybody, though, not the way I run stuff.
My keyboard sweats from the possibilities.

Categories

Resources