How to Fix: Nextcloud “This version of Nextcloud is not compatible with > PHP 7.3. You are currently running 7.4.0”

Temporary workaround to get you going:

1 Find “/lib/versioncheck.php” under Nextcloud’s folder on the server.

2 Change the number after second “if (PHP_VERSION_ID >= ” to smaller than the current one but greater than the first number at the top of the image.

versioncheck.php
versioncheck.php

Warning: This workaround may get Nextcloud back online again, but it will probably cause lots of php warnings. Also it’s not recommended to leave the Nextcloud running in this state. You should upgrade the Nextcloud to latest version or downgrade your php version on the server.


Windows “Another installation is already in progress error”

Error

“Another program is being installed. Please wait until that installation is complete, and then try installing this software again.”

“Another installation is already in progress. Complete that installation before proceeding with this install.”

“Cannot run when setup is in progress.”

“Another installation is in progress. You must complete that installation before continuing this one.”

etc…


If it is due to running “msiexec.exe” try following

1 Copy and save following to Killmsiexec.bat or Killmsiexec.cmd

@echo off
echo dannyda.com
tasklist /fi "imagename eq msiexec.exe" | find /i "msiexec.exe" > nul
if not errorlevel 1 (taskkill /f /im "msiexec.exe") else (
  echo program msiexec.exe is not running
)
pause

2 Right click and run Killmsiexec.bat or Killmsiexec.cmd with administrator privilege

3 Now try the to install or uninstall the program again

How to Troubleshoot/Investigate Ubuntu slow boot/startup (systemd)

Keywords: Ubuntu check slow boot, Ubuntu check slow startup, Ubuntu troubleshoot slow boot, Ubuntu check slow startup, systemd, systemd-analyze blame, Kali Linux, boot time, slow boot time, slow startup time


Sometimes, Ubuntu startup takes very long time, we want to find out the cause.

(Following command is not limited to Ubuntu, it can actually be used on any Linux distributions with systemd installed)

When the systems boots up completely, we can use following command to check which process took longest time during boot time.

$ sudo systemd-analyze blame
systemd-analyze blame output from Kali Linux
systemd-analyze blame output from Kali Linux

We can also use head to see top 10 slowest ones

$ sudo systemd-analyze blame | head
sudo systemd-analyze blame | head output from Kali Linux
sudo systemd-analyze blame | head output from Kali Linux

How to: Enable/Disable Apache2 modules and configuration files on Ubuntu (a2enconf, a2disconf, a2enmod, a2dismod)

(If the module is not installed yet use apt to install first or compile from source. Then follow the guide)

Sometimes before enabling apache2 modules, we might need to enable configuration file for the module first, use following command

This can be used to switch php version as well

1 Enable configuration file

#e.g. enable php7.4-fpm configuration file for apache2
sudo a2enconf php7.4-fpm

To disable configuration file for apache2 we can use

#e.g. disable php7.4-fpm configuration file for apache2
sudo a2disconf php7.4-fpm

2 Enable apache2 module

#e.g. enable php7.4-fpm module for apache2
sudo a2enmod php7.4-fpm

To disable module for apache2 we can use

#e.g. disable php7.4-fpm module for apache2
sudo a2dismod php7.4-fpm

Following by a reload or restart for apache2, we should be good to go.

3 Reload or Restart apache2 to make the changes take effect (Ubuntu 15.04+ or above)

#e.g. To reload apache2
sudo systemctl reload apache2
OR
sudo systemctl reload apache2.service
#e.g. To restart apache2
sudo systemctl restart apache2
OR
sudo systemctl reload apache2.service

(For Ubuntu 14.10 or older without systemd use following command to reload/restart apache2)

#e.g. To reload apache2
sudo service apache2 reload
OR
sudo /etc/init.d/apache2 reload
#e.g. To restart apache2
sudo service apache2 restart
OR
sudo /etc/init.d/apache2 restart

Extended reading

a2enconf, a2disconf

a2enconf is a script that enables the specified configuration file within the apache2 configuration. It does this by creating symlinks within /etc/apache2/conf-enabled. Likewise, a2disconf disables a specific configuration part by removing those symlinks. It is not an error to enable a configuration which is already enabled, or to disable one which is already disabled. Note that many configuration file may have a dependency to specific modules. Unlike module dependencies, these are not resolved automatically. Configuration fragments stored in the conf-available directory are considered non-essential or being installed and manged by reverse dependencies (e.g. web scripts). — Ubuntu Manual

a2enmod, a2dismod

a2enmod is a script that enables the specified module within the apache2 configuration. It does this by creating symlinks within /etc/apache2/mods-enabled. Likewise, a2dismod disables a module by removing those symlinks. It is not an error to enable a module which is already enabled, or to disable one which is already disabled. Note that many modules have, in addition to a .load file, an associated .conf file. Enabling the module puts the configuration directives in the .conf file as directives into the main server context of apache2. — Ubuntu Manual

systemctl

systemctl may be used to introspect and control the state of the “systemd” system and service manager. Please refer to systemd(1) for an introduction into the basic concepts and functionality this tool manages. — Ubuntu Manual

Configure Squid proxy with php redirector

Squid proxy can be used with different redirectors and rewriters, in this guide we will be using a redirector written with php.

This guide is using Ubuntu 18.04 LTS, your configuration file maybe located differently if using different version or Linux distribution etc.

Note: Before starting following this guide, you have to make sure your squid proxy is configured properly and running without any issue.

Squid configuration

1 Open squid configuration file from

/etc/squid/squid.conf

or

/etc/squid3/squid.conf

For following steps, make sure you are using right path/configuration file (either /squid/ or /squid3/), I will be using /squid/

2 Add following line

url_rewrite_program /usr/bin/php /etc/squid/redirect.php

This indicates that we will be using an redirector/ url write program written in php so that we will need php binary to run the script thus “/usr/bin/php” the redorector file path is “/etc/squid/redirect.php” which means will be putting the “redirect.php” file under “/etc/squid”

PHP url rewrite program/redirector

1 We create a “redirect.php” file under “/etc/squid/”

2 We write necessary script

#!/usr/bin/php
<?php
//By https://dannyda.com
//Modified based on
//http://wiki.squid-cache.org/ConfigExamples/PhpRedirectors
//Using PHP for Redirects
 
//and
 
//https://aacable.wordpress.com/tag/squid-url-redirection/
//------------------------------------------------------------------------------
$temp = array();
// Extend stream timeout to 24 hours
stream_set_timeout(STDIN, 86400);
while ( $input = fgets(STDIN) ) {
  // Split the output (space delimited) from squid into an array.
  $temp = explode(' ', $input);
  // Set the URL from squid to a temporary holder.
  $output = $temp[0] . "\n";
	if(preg_match("/(.*[0-9])\/ABCD\/.*/i", $input)){
		//Replace any url matching xxx.xxx.xxx.xxx/ABCD/aaaaaaaaaaaaaaaaaaaaaa and change to to my.blocked.com/ABCD/aaaaaaaaaaaaaaaaaaaaaa
		$output = "308:".str_replace(parse_url($input,PHP_URL_HOST),'my.blocked.com',strtok($input, ' '))."\n"; //Outout intended modified url (308 Permanent Redirect)
		//file_put_contents("/etc/squid/a.txt", $input,FILE_APPEND); //For debugging we can enable this line, output will be found at /etc/squid/a.txt
		//$output = "302:"."http://www.google.com/"."\n"; //(302 Found, Moved Temporarily)
		
		//We can either output modified url based on ip address, partial url matching, domain matching and modify partialy as well or we can redirect to another url completely
		//Following by more examples
	}
	
	if(preg_match("/(.*[0-9])\/forum\/.*\/sign\=.*\.jpg/i", $input)){
		$output = "308:".str_replace(parse_url($input,PHP_URL_HOST),'mytestforum.com',strtok($input, ' '))."\n";
		// /forum/*/sign
	}
	
	if(preg_match("/(.*[0-9])\/forum\/pic\/item\/.*\.jpg/i", $input)){
		$output = "308:".str_replace(parse_url($input,PHP_URL_HOST),'mytestforum.com',strtok($input, ' '))."\n";
		// /forum/pic/item
	}
	//---------------------------------------------------------------------------
	//Temporarily block URLs based on partial url match with regular expression
	if(preg_match("/ad\.m\.domain\.com(\/.*|$)/i", $input)){
		$output = "308:"."http://255.255.255.255"."\n";
		//adash.m.taobao.com
	}
	if(preg_match("/.*admaster\.com.*/i", $input)){
		$output = "308:"."http://255.255.255.255"."\n";
		//*.admaster.com.cn
	}
	
	if(preg_match("/.*\/AdvertiseInterface\//i", $input)){
		$output = "308:"."http://255.255.255.255"."\n";
		//ad
		//http://albatrosscn.buddylync.com:8080/AdvertiseInterface/
	}
	
	if(preg_match("/.*\/advertise\//i", $input)){
		$output = "308:"."http://255.255.255.255"."\n";
		//ad
		//http://*/advertise/
	}
	
  echo $output;
}

3 We add execute permission

chmod +x /etc/squid/redirect.php

4 We restart squid

~# systemctl restart squid

5 Now we should be able to see the redirector in action

Extended reading

Bonus

Online regular expression testers

Which can help you craft desired regular expression for use within redirector

Ubuntu/Linux Check SSD trim status

Keywords: Linux, Ubuntu, SSD, trim, Status, Solid State Drive, fstrim, fstrim.timer, systemd, systemctl, fstrim, fstrim.timer

1 Launch your terminal

2 Enter following commands to check status

Check trim Timer/Schedule status

# systemctl status fstrim.timer
Ubuntu -  systemctl status fstrim.timer
Ubuntu – systemctl status fstrim.timer

Check Trim status

# systemctl status fstrim
Ubuntu -  systemctl status fstrim
Ubuntu – systemctl status fstrim

Check NTP server working or not, Check NTP server Date and Time – Windows, Linux

Windows

1 Use Win + R to open run Window

Microsoft Windows - Run window
Microsoft Windows – Run window

2 Type cmd, then hit Enter key

Microsoft Windows - Run window - cmd.exe
Microsoft Windows – Run window – cmd.exe

The command we use is in following format:

w32tm /stripchart /computer:domainnameORipaddress /dataonly /samples:5

3 Enter following command to test “time.windows.com”

w32tm /stripchart /computer:time.windows.com /dataonly /samples:5
Microsoft Windows - CMD -   w32tm /stripchart /computer:time.windows.com /dataonly /samples:5 output
Microsoft Windows – CMD – w32tm /stripchart /computer:time.windows.com /dataonly /samples:5 output

Bonus: Other commands

1 Show the current time zone settings:

w32tm /tz

2 List external NTP servers (peers)

w32tm /query /peers
Microsoft Windows - CMD -  w32tm /query /peers output
Microsoft Windows – CMD – w32tm /query /peers output

Note! If you have encountered this error: “The following error occurred: The service has not been started. (0x80070426)”, you need to start the “Windows Time” service, you can start a elevated cmd or PowerShell by using Win + X key combination then select “Command Prompt (Admin)” or “Windows PowerShell (Admin)” then type “sc start W32Time” to start the Windows Time service or using Run window and type “services.msc” then find “Windows Time” service and start it.

3 Restore Windows Time service settings to default

C:\>net stop w32time
C:\>w32tm /unregister
C:\>w32tm /register
C:\>net start w32time

4 Re-sync Time

Resynchronize the clock as soon as possible, disregarding all accumulated error statistics. If no computer is specified, the local computer will resynchronize. The command will wait for resynchronization unless the /nowait switch is used.

w32tm /resync

5 Redirect the network configuration and Re-sync time

Force redetection of network resource before resynchronization.

w32tm /resync /rediscover
Microsoft Windows - PowerShell - w32tm /resync /rediscover output
Microsoft Windows – PowerShell – w32tm /resync /rediscover output

6 Check current NTP configuration

Show Information:

w32tm /query /status
Microsoft Windows - PowerShell -  w32tm /query /status  output
Microsoft Windows – PowerShell – w32tm /query /status output

Show Configuration:

w32tm /query /configuration
Microsoft Windows - PowerShell -  w32tm /query /configuration  output
Microsoft Windows – PowerShell – w32tm /query /configuration output

Linux

1 ntpdate -q domainnameORipaddress

ntpdate -q time.windows.com
Linux - Terminal - ntpdate -q time.windows.com output
Linux – Terminal – ntpdate -q time.windows.com output

2 ntpq -p domainnameORipaddress

ntpq -p 192.168.1.1

Windows Server, Windows 10 missing disk performance counter in Task Manager

To fix missing disk performance counter in Task Manager:

Windows Task Manager missing disk performance counter
Windows Task Manager missing disk performance counter

Windows Task Manager with disk performance counter
Windows Task Manager with disk performance counter

Fix

1 Use Win + X key combination to open menu, click on Windows PowerShell (Admin) to open elevated PowerShell window.

2 Close Task Manager if you have it open

3 Type following command and hit Enter Key

diskperf -y
Windows PowerShell - diskperf -y
Windows PowerShell – diskperf -y

4 Now open Windows Task Manager again, the disk performance counter should appear.

Note: To diesable it again, just repeat these steps but replace diskperf -y with diskperf -n

How to use Apache .htaccess .htpasswd to protect files, folders and paths and to protect multiple files, multiple folders and paths

Keywords: Apache, .htaccess, .htpasswd, block access, protect file, protect folder, protect directory, protect path

If we have following folders

/web/resource1/file1.htm
/web/resource1/A/
/web/resource2/file2.php
/web/resource2/B/C/D/
/web/resource3/E/F/

and Following url path

https://www.example.com/
https://www.example.com resource1/file1.htm
https://www.example.com/ resource1/A/
https://www.example.com/ resource2/file2.php
https://www.example.com/ resource2/B/C/D/
https://www.example.com resource3/E/F/ https://www.example.com/secret

The document root for “https://www.example.com/” is “/web/”

Path secret is a virtual path which does not reflect to a real directory with name “secret” (e.g. an existing rewrite rule in .htaccess)

Now we want to protect file “file1.htm” directory “D” and directory “E”, “F” and virtual path “secret”

1.1 We need to create a .htaccess file under “web” directory

1.2 Open the .htaccess file, we need to add following contents for protecting files

#Protected file
<Files file1.htm>
#Password file path
AuthUserFile /web/.htpasswd
#Message for user to see
AuthName "Password protected"
AuthType Basic
#(If only allow specific user, use "require user username" if allow all valid users use "Require valid-user")
require user username
</Files>

Note: if dealing with multiple files, filesmatch should be used.

<FilesMatch "file1\.htm|file2\.php">
AuthUserFile /web/.htpasswd
AuthName "Password protected"
AuthType Basic
require user username
</FilesMatch>

Tip: Targeting files start with abc or def and end in .php

<FilesMatch "^(abc|def).php$">
AuthUserFile /web/.htpasswd
AuthName "Password protected"
AuthType Basic
require user username
</FilesMatch>

1.3 We add following content to protect directories and the virtual path (We can use this method to protect multiple sub-directories/sub-folders/paths)

#Do the regex check against the URI here, if match, set the "require_auth" var
SetEnvIf Request_URI ^/ resource2\/B\/C\/D require_auth=true
SetEnvIf Request_URI ^/ resource3\/E require_auth=true
#Auth stuff
AuthUserFile /web/.htpasswd
AuthName "Password protected"
AuthType Basic
#Setup a deny/allow
Order Deny,Allow
#Deny from everyone
Deny from all
#except if either of these are satisfied
Satisfy any
#1. a valid authenticated user
Require valid-user
#or 2. the "require_auth" var is NOT set
Allow from env=!require_auth

https://stackoverflow.com/questions/14603568/password-protect-a-specific-url

1.4 We create a .htpasswd file under “web” directory

1.5 Open the .htpasswd file we add following contents (File contains username:hashed user password)

user1:$apr1$MknR4YQ8$ls4RTpNIxaJWyedBK5m030
user2:$apr1$FtfabsVg$NoxTA07DDeGhSOYT9NMLF/

These password can be generated using htpasswd with following command:

$  sudo htpasswd -c /web/.htpasswd user1
(You will need to supply and confirm the password for the user)
$ sudo htpasswd /web/.htpasswd user2

Another way to protect current directory:

e.g. If we want to protect directory “A”

2.1 Creat a .htaccess file under in directory “A”, so we have “/web/resource1/A/.htaccess”

2.2 We add following content to the file

<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /web/resource1/A/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user 
order deny,allow

2.3 We create the .htpasswd file under “/web/resource1/A/”, so we have “/web/resource1/A/.htpasswd”

2.4 We generate password as in step 1.5 (We need to change path from “/web/.htpasswd” to “/web/resource1/A/.htpasswd”)

Now the directory “A” is protected


Tips:

1 We can use online .htpasswd generator to create password for convenience

https://www.web2generators.com/apache-tools/htpasswd-generator

https://www.askapache.com/online-tools/htpasswd-generator/

https://htmlstrip.com/htpasswd-generator

https://www.mobilefish.com/services/htpasswd_generator/htpasswd_generator.php

2 We can use online tools to generate .htaccess for convenience

https://www.htaccessredirect.net/

https://hostingfacts.com/htaccess-generator/

https://makeawebsitehub.com/htaccess-generator/