How to trim URL to root domain?

No, I didn't intend this solution for the OP of this thread.

Yes, there is. Basically you can distribute any module with your script. (You just have to add 2 lines in the script with the location of the module.) I've done this with LB actions that include a perl script and need modules. With LB this is easy, since you can just include all resources inside the action bundle.

With KM it's not so easy because a macro file cannot include resources und you would have to tell the user where to put exactly the other files. See this thread :wink:

Cheers

1 Like

Wow. Tom. You guys really are cool! Thanks.

@JMichaelTX @Tom

I actually made use of document.domain JS, and [^.]+.[^.]+$ to trim server names to domain name. The JS part actually saved me my additional step of copying URL to clipboard.

I actually designed a macro that shows age in format like 2 years, 3 months, and 4 days old. It's inflating the actual age by 4-5 days for old domains. I think this is due to Keyboard Maestro rounds off values especially in the line that says zzzAgeDaysTemp MOD 30.5

Get Domain Age .kmmacros (7.1 KB)

Yes the modulo seems to accept only integers, so MOD 30.5 is the same as MOD 30.

So this should work (calculating in seconds):

Get Domain Age (Calc with Seconds).kmmacros (8.2 KB)

Used values:

1 year = 365.25 days = 31557600 seconds
1 month = 30.4375 days = 2629800 seconds
1 day = 86400 seconds

Hi @JMichaelTX and @AkshayHallur,

since I already started with the Perl script yesterday, I couldn't resist to complete it :wink:

Advantages over the other solution:

  • No wonky regex used. The domain root is determined with the help of the Current Effective TLD List. So, the script has no problems with fancy stuff like www.cs.tut.fi or kartolo.sby.datautama.net.id.
  • The script is auto-choosing the correct Whois server for the domain.
  • Since different Whois servers are using different output formats, server-specific parsers are used to extract the Domain Creation Date.
  • Not really important, but the age is calculated properly, not based on an average month length.

Output example:


Domain Date and Age (Perl Variant).kmmacros (4.5 KB)


The content of the script:

#!/usr/bin/env perl

use 5.010;
use strict;
use warnings;

use Domain::PublicSuffix;
use Net::Domain::ExpireDate;
use Date::Calc qw(Today Delta_Days N_Delta_YMD);

# Getting the input from KM
my $url_input = qx/osascript -e 'tell application "Keyboard Maestro Engine" to getvariable "ddaURL"'/;
chomp($url_input);

# Getting domain (root)
my $suffix = Domain::PublicSuffix->new();
my $domain = $suffix->get_root_domain($url_input);

# Get creation and expiry date of domain
(my $creation_str, my $expiry_str) = domain_dates($domain, '%Y-%m-%d');

# Date calculations
my $gmt = 1;
(my $year_creation, my $month_creation, my $day_creation) = split('-', $creation_str);
(my $year_now, my $month_now, my $day_now) = Today([$gmt]);

my $delta_days_total = Delta_Days($year_creation, $month_creation, $day_creation, $year_now, $month_now, $day_now);

(my $delta_years, my $delta_months, my $delta_days) = N_Delta_YMD($year_creation, $month_creation, $day_creation, $year_now,  $month_now, $day_now);

# Output
my $year_label = $delta_years == 1 ? ' year, ' : ' years, ';
my $month_label = $delta_months == 1 ? ' month, ' : ' months, ';
my $day_label = $delta_days == 1 ? ' day' : ' days';

say 'Domain:        ' . $domain;
say 'Creation date: ' . $creation_str;
say 'Expiry date:   ' . $expiry_str;
say 'Age:           ' . $delta_years . $year_label . $delta_months . $month_label . $delta_days . $day_label;
say 'Age in days:   ' . $delta_days_total;

__END__

=begin comment

For best results:
Download the most recent TLD names list from 
http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
and save it @ /usr/local/effective_tld_names.dat

=end comment


Update (2017-09-11):

Output: Correct singular forms now ("1 month", not "1 months", etc.)

1 Like

Looks good Tom. Could you please upload your final macro?

Thanks.

Done.

1 Like

Hey @JMichaelTX, let me know if it works for you.

If not, we can continue the install-a-perl-module odyssey :grinning:

Oh heck, the odyssey is such fun, let's continue it! :wink:

I get this error:

Can't locate Domain/PublicSuffix.pm in @INC (you may need to install the Domain::PublicSuffix module) (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at /var/folders/_2/7b0tgl916vg3ft82hgl011vm0000gn/T/Keyboard-Maestro-Script-66D1CE2A-91C9-43AA-AD6C-3FB89C73DDBF line 7.
BEGIN failed--compilation aborted at /var/folders/_2/7b0tgl916vg3ft82hgl011vm0000gn/T/Keyboard-Maestro-Script-66D1CE2A-91C9-43AA-AD6C-3FB89C73DDBF line 7.

1 Like

LOL, OK :slight_smile:

First:

Have you installed (with cpanm) the three modules listed in the script (after the “use”)?

Domain::PublicSuffix
Net::Domain::ExpireDate
Date::Calc

If yes, did you get any install errors from cpanm? (“Install failed” or something similar)

No. Sorry, I'm on a different Mac now, and I forgot I needed to do all that stuff.
May I suggest that you add the following to your macro:

  1. Instructions on installing all that stuff, including perl.
  2. At the top of your macro, test for all the modules you need, and report an error if you don't find all of them.

So, if you don't mind, could you please list all of the Terminal install commands for me? Can I run them together, or just one at a time?

Also, what about the path? Why is my path different?

Thanks.

Maybe, someday. But, as you have seen, there is more than one way to install perl :wink:

This information can be found in the Perl script, and perl itself is already testing for the presence of the required modules. (See the error message you have posted above.)

IIRC you succeeded to install perl 5.26 and cpanm on your other Mac two days ago. So I suggest to first read through the posts from two days ago.

To sum it up:

  1. Install perl via Homebrew. Follow the instructions you see in the Terminal during/after the install. (Speaking namely of this one.)

  2. Install cpanm as you have done two days ago.

  3. Create the ENV_PERL5LIB variable in KM with the paths as shown. It is also extremely helpful that you set up your ENV_PATH variable so that it includes the Homebrew install path. These are for example my paths:

    ENV_PATH: /Users/tom/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

    ENV_PERL5LIB: /Users/tom/perl5/lib/perl5:/usr/local/Cellar/perl/5.26.0/lib/perl5/site_perl/5.26.0

    Replace tom with your account name, of course.

  4. Install the modules as required by the script (cpanm <module name>)

Nope. Do as described above and keep an eye on messages in the Terminal.

Also, I would install the modules one by one, because sometimes cpanm throws an error. (Most of the times a dependency problem.)

This has to do how you have configured it during/after the install. (locallib or not, the mentioned HB message).

BTW, since you are on a different Mac now, do you have the ~/.bash_profile and/or the ~/.bashrc on this computer?

What is the best way to check for these and/or display them?

Are these KM Variables, or something I need to set in Terminal?
If in terminal, how do I set them?

Sorry for the basic questions, but remember I'm a shell script novice.
Also, others may have the same questions.

  1. In the Finder go to your Home directory (⇧⌘H)
  2. Show the invisible files with .

No, as said "in KM". See also this KM Wiki article.

  1. Open KM Editor's Preferences (⌘,)

  2. Go to Variables

  3. If the variables are already there, then edit them. If not, then create them by clicking the + button at the bottom of the window.

So, no Terminal needed for that.

No, I do not have either.
How do I create them, and what is their content?

Can I use ~ instead of /users/<MyUserName> ?
~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin