New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DietPi-Services/Software | Specific start/install- and reverted stop/uninstall order #1462

Closed
MichaIng opened this Issue Feb 3, 2018 · 11 comments

Comments

@MichaIng
Collaborator

MichaIng commented Feb 3, 2018

Some services depend on/access others. As DietPi-Services starts and stops them in the same order, there are short time spans, where errors can occur. I sometimes see access errors on database access tries or cron jobs accessing to web server e.g., during the many start/stop/restarts, done during testing installations.

We could reorder some obvious services and go through the array backwards (if possible), if services are stopped:

  • start: database(s) > PHP > web server > cron
  • stop: cron > web server > PHP > database(s)

On restart of course we can't fully prevent those errors, but the affected time spans are again shorter.

If this is guaranteed, I will also add ownCloud/Nextcloud maintenance mode as oneshot systemd services, once implemented and remove their current exceptional position from dietpi-services code 😄.

@MichaIng MichaIng changed the title from DietPi-Services | Specific and reverted start/stop order to DietPi-Services | Specific start- and reverted stop order Feb 3, 2018

@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Feb 14, 2018

Collaborator

Same could be done for installation/uninstallation:

  • On installation the order works quite well, but on uninstallation it counts the indexes upwards and breaks e.g. database/user deletions, if MariaDB is removed as well (okay this is no problem), but also database backups, if wanted (ownCloud/Nextcloud), before dumping, to prevent accidents, will break.
  • But to be true, this is no "real" issue, as rarely someone removed several software at once, especially not some database dependent software together with a database, without doing some manual backup first or being 100% sure, that it is not needed 😉. It is more a consistent design thing, if installing/uninstalling service start/stop is done in exact reverse order for dependency reasons.
Collaborator

MichaIng commented Feb 14, 2018

Same could be done for installation/uninstallation:

  • On installation the order works quite well, but on uninstallation it counts the indexes upwards and breaks e.g. database/user deletions, if MariaDB is removed as well (okay this is no problem), but also database backups, if wanted (ownCloud/Nextcloud), before dumping, to prevent accidents, will break.
  • But to be true, this is no "real" issue, as rarely someone removed several software at once, especially not some database dependent software together with a database, without doing some manual backup first or being 100% sure, that it is not needed 😉. It is more a consistent design thing, if installing/uninstalling service start/stop is done in exact reverse order for dependency reasons.

@Fourdee Fourdee added this to the v6.3 milestone Feb 18, 2018

@MichaIng MichaIng changed the title from DietPi-Services | Specific start- and reverted stop order to DietPi-Services/Software | Specific start/install- and reverted stop/uninstall order Feb 25, 2018

@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Feb 25, 2018

Collaborator

Other specific issue of uninstall order: #1523

I have two ideas:

  1. Read/check temp uninstall file directly within loop:
  2. Do not G_AGP within loop, do just apt-mark auto and let G_AGA to actual purging in it's preferred order. Would need testing, especially dpkg -P would need to be handled separately, but at least those manual installed package titles are mostly (needs review) no dependencies of others.
Collaborator

MichaIng commented Feb 25, 2018

Other specific issue of uninstall order: #1523

I have two ideas:

  1. Read/check temp uninstall file directly within loop:
  2. Do not G_AGP within loop, do just apt-mark auto and let G_AGA to actual purging in it's preferred order. Would need testing, especially dpkg -P would need to be handled separately, but at least those manual installed package titles are mostly (needs review) no dependencies of others.

Fourdee added a commit that referenced this issue Feb 27, 2018

v6.3
+ DietPi-Services | Service stop order is now reversed:
#1462 (comment)
@Fourdee

This comment has been minimized.

Show comment
Hide comment
@Fourdee

Fourdee Feb 27, 2018

Owner

@MichaIng

Sent commit to reverse stop order 08b8e91

 Mode: start

[  OK  ] DietPi-Services | start : cron
[  OK  ] DietPi-Services | start : lighttpd
[  OK  ] DietPi-Services | start : php7.0-fpm
[  OK  ] DietPi-Services | start : mysql
[  OK  ] DietPi-Services | start : redis-server
[  OK  ] DietPi-Services | start : mpd
[  OK  ] DietPi-Services | start : avahi-daemon

---

Mode: stop

[  OK  ] DietPi-Services | ncc maintenance:mode --on
[  OK  ] DietPi-Services | stop : avahi-daemon
[  OK  ] DietPi-Services | stop : mpd
[  OK  ] DietPi-Services | stop : redis-server
[  OK  ] DietPi-Services | stop : mysql
[  OK  ] DietPi-Services | stop : php7.0-fpm
[  OK  ] DietPi-Services | stop : lighttpd
[  OK  ] DietPi-Services | stop : cron
Owner

Fourdee commented Feb 27, 2018

@MichaIng

Sent commit to reverse stop order 08b8e91

 Mode: start

[  OK  ] DietPi-Services | start : cron
[  OK  ] DietPi-Services | start : lighttpd
[  OK  ] DietPi-Services | start : php7.0-fpm
[  OK  ] DietPi-Services | start : mysql
[  OK  ] DietPi-Services | start : redis-server
[  OK  ] DietPi-Services | start : mpd
[  OK  ] DietPi-Services | start : avahi-daemon

---

Mode: stop

[  OK  ] DietPi-Services | ncc maintenance:mode --on
[  OK  ] DietPi-Services | stop : avahi-daemon
[  OK  ] DietPi-Services | stop : mpd
[  OK  ] DietPi-Services | stop : redis-server
[  OK  ] DietPi-Services | stop : mysql
[  OK  ] DietPi-Services | stop : php7.0-fpm
[  OK  ] DietPi-Services | stop : lighttpd
[  OK  ] DietPi-Services | stop : cron
@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Feb 27, 2018

Collaborator

@Fourdee
Nice one! I will now try to reorder a bid.

Collaborator

MichaIng commented Feb 27, 2018

@Fourdee
Nice one! I will now try to reorder a bid.

@Fourdee

This comment has been minimized.

Show comment
Hide comment
@Fourdee

Fourdee Mar 1, 2018

Owner

ToDo:

Owner

Fourdee commented Mar 1, 2018

ToDo:

@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Mar 2, 2018

Collaborator

@Fourdee
I was playing around a bid:

        Uninstall_Banner(){

                echo ''
                G_DIETPI-NOTIFY 0 "Uninstalling ${aSOFTWARE_WHIP_NAME[$uninstall_index]}: ${aSOFTWARE_WHIP_DESC[$uninstall_index]}\n"

        }

        Uninstall_Software(){

                #NB: systemctl daemon-reload is executed after this func in Uninstall_Software_Finalize()

                local uninstall_list=" $@ "

                #----------------------------------------------------------------------
                #Inform User
                G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" "Uninstall"

                #echo -e ""
                #G_DIETPI-NOTIFY 0 "Uninstalling ${aSOFTWARE_WHIP_NAME[$index]}: ${aSOFTWARE_WHIP_DESC[$index]}\n"

                #Was a uninstall event trigged?
                local valid_input=1

                #----------------------------------------------------------------------
                #DIETPI SOFTWARE

                local uninstall_index=23
                if [[ "$uninstall_list" =~ " $uninstall_index " ]]; then

                        Uninstall_Banner
                        G_AGP lxde lxde-* upower policykit-1 iceweasel

                fi

                uninstall_index=24
                if [[ "$uninstall_list" =~ " $uninstall_index " ]]; then

                        Uninstall_Banner
                        G_AGP mate-desktop-environment-extras upower policykit-1 iceweasel
...
        Input_Modes(){
...
                                if [ "$1" = "uninstall" ]; then

                                        Uninstall_Software "${ainput[@]}"
                                        Uninstall_Software_Finalize
        Uninstall_NonSelected_Choices(){

                #Uninstall software using our temp uninstall list
                if [ -f "$UNINSTALL_FILE" ]; then

                        local uninstall_list
                        #Run the temp uninstall script
                        while read -r line
                        do

                                uninstall_list+=" $line "

                        done < $UNINSTALL_FILE
                        Uninstall_Software "$uninstall_list"
                        rm $UNINSTALL_FILE

                fi

        }

Generally it works, but printing uninstall info to log and adjusting /DietPi/dietpi/.installed needs to be inside every if statement as well. A lot of additional lines, much work anyway. I don't like it too much.

Second solution with just apt-mark auto and autoremove everything afterwards is also not a really nice solution, as it is a bid in-transparent, what is done due to which uninstall. I would like to have most things done within the single uninstall statements.

Maybe we could handle it similar than for installation? Add a new uninstall flag -1 to /DietPi/dietpi/.installed and check for this within Uninstall_Software()? It maybe needs as much work as the other solutions above, but at least we can just copy the methods from installation and be consistent here. This would enable us as well to use the same functions for both, reading string and adjusting /DietPi/dietpi/.installed just based of where we come from, install- or uninstall menu respectively "$1".

  • I will further play with this last idea. The more I think about it, the more I like it 😉.
Collaborator

MichaIng commented Mar 2, 2018

@Fourdee
I was playing around a bid:

        Uninstall_Banner(){

                echo ''
                G_DIETPI-NOTIFY 0 "Uninstalling ${aSOFTWARE_WHIP_NAME[$uninstall_index]}: ${aSOFTWARE_WHIP_DESC[$uninstall_index]}\n"

        }

        Uninstall_Software(){

                #NB: systemctl daemon-reload is executed after this func in Uninstall_Software_Finalize()

                local uninstall_list=" $@ "

                #----------------------------------------------------------------------
                #Inform User
                G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" "Uninstall"

                #echo -e ""
                #G_DIETPI-NOTIFY 0 "Uninstalling ${aSOFTWARE_WHIP_NAME[$index]}: ${aSOFTWARE_WHIP_DESC[$index]}\n"

                #Was a uninstall event trigged?
                local valid_input=1

                #----------------------------------------------------------------------
                #DIETPI SOFTWARE

                local uninstall_index=23
                if [[ "$uninstall_list" =~ " $uninstall_index " ]]; then

                        Uninstall_Banner
                        G_AGP lxde lxde-* upower policykit-1 iceweasel

                fi

                uninstall_index=24
                if [[ "$uninstall_list" =~ " $uninstall_index " ]]; then

                        Uninstall_Banner
                        G_AGP mate-desktop-environment-extras upower policykit-1 iceweasel
...
        Input_Modes(){
...
                                if [ "$1" = "uninstall" ]; then

                                        Uninstall_Software "${ainput[@]}"
                                        Uninstall_Software_Finalize
        Uninstall_NonSelected_Choices(){

                #Uninstall software using our temp uninstall list
                if [ -f "$UNINSTALL_FILE" ]; then

                        local uninstall_list
                        #Run the temp uninstall script
                        while read -r line
                        do

                                uninstall_list+=" $line "

                        done < $UNINSTALL_FILE
                        Uninstall_Software "$uninstall_list"
                        rm $UNINSTALL_FILE

                fi

        }

Generally it works, but printing uninstall info to log and adjusting /DietPi/dietpi/.installed needs to be inside every if statement as well. A lot of additional lines, much work anyway. I don't like it too much.

Second solution with just apt-mark auto and autoremove everything afterwards is also not a really nice solution, as it is a bid in-transparent, what is done due to which uninstall. I would like to have most things done within the single uninstall statements.

Maybe we could handle it similar than for installation? Add a new uninstall flag -1 to /DietPi/dietpi/.installed and check for this within Uninstall_Software()? It maybe needs as much work as the other solutions above, but at least we can just copy the methods from installation and be consistent here. This would enable us as well to use the same functions for both, reading string and adjusting /DietPi/dietpi/.installed just based of where we come from, install- or uninstall menu respectively "$1".

  • I will further play with this last idea. The more I think about it, the more I like it 😉.

@Fourdee Fourdee referenced this issue Mar 7, 2018

Merged

v6.3 #1590

Fourdee added a commit that referenced this issue Mar 7, 2018

Merge pull request #1590 from Fourdee/testing
**v6.3**
(07/03/18)

**Image Changes:**

Native PC BIOS | Image now available: http://dietpi.com/download

NanoPi Neo | Image now available (based on FriendlyARM official image): #1588

**Changes / Improvements / Optimizations:**

General | DietPi now uses its own "dietpi-postboot.service" to initiate dietpi-services, instead of /etc/rc.local. The latter will be reset on update, but in case of manual adjustments, a backup is safed to dietpi_userdata. The initiating "rc-local.service" will stay in place as well, so /etc/rc.local can be used as before: #1376

General | Additional getty's (2-6) are now disabled via mask. This reduces resource usage for unneeded screens: #1541

General | APT: 'Disabled install recommends' is now standard and default across all DietPi images: #1482 (comment)

General | Sparky SBC kernel patches: Pro-Ject-S2 dac DSD native support on sparky, also other few dac ids. Thanks @sudeep.

General | /tmp tmpfs size is now automatically set to 50% of RAM+SWAP, (previously 50% RAM only). To prevent out of memory errors during certain software installations (eg: Mono), where the swapfile can be used only when needed: #1027 (comment)

DietPi-Automation | dietpi.txt entries and support added for WPA2 Enterprise (WPA-EAP). Many thanks to @Symo for implementing this feature!: #1547

DietPi-Backup | Once backup is completed, you will be asked if you wish to view the log file, for the full rsync log.

DietPi-Banner | Improved notification when no network is detected: #1576

DietPi-Globals | G_WHIP*: Further additions and improvements, including automatic scaling: #1546 #1546 (comment)

DietPi-LetsEncrypt | Lighttpd: Added support for HSTS (HTTP Strict Transport Security): #1553

DietPi-LetsEncrypt | Minor rework and cleaning, using now /etc/systemd/system/certbot.service.d/dietpi-script.conf for web server specific renewal hooks: #1553

DietPi-Software | Shairport-sync: Updated to 3.1.7 for all devices. Also enabled for x86_64: #1548

DietPi-Software | Proftp: Now defaults to dietpi user with root login off: #1529 (comment)

DietPi-Software | RPi Cam Web Interface (Previously DietPiCam): Updated to 6.4.17 and resolves previously failed installation. URL has also changed to http://ip/rpicam : #1512

DietPi-Software | Sonarr: Now uses the develop repo branch, inline with our Radarr install: #1566 (comment)

DietPi-Software | Mono: Raspbian dist is now used for RPi devices: #1566

DietPi-Software | FFmpeg: Fix backports dependency issues for all Odroids: #1556

DietPi-Software | Improved UI options during NTPD failure. You will now be given multiple options that will assist in resolving NTPD time sync issues on your network: #1580 (comment)

DietPi-Software | NTPD check will now run after the internet connection test, to prevent unnecessary delay when network is not yet configured:

DietPi-Software | SubSonic 5: Replaced with Airsonic: #1585

DietPi-Software | Aria2: Optimized installation and connection settings based on hardware. Now uses a configuration file '/var/lib/dietpi/dietpi-software/installed/aria2.conf', which will allow users to change aria2 settings permanently. Please note, the aria2-webui does not support saving settings after session shutdown, this is a known limitation with the software, please use the aria2.conf to make changes: #1575

DietPi-Sync | Once sync is completed, you will be asked if you wish to view the log file, for the full rsync log.

DietPi-Update | G_AGUP/G_AGUG: Now runs prior to our patch system. Ensuring APT is upto date during our updates: http://dietpi.com/phpbb/viewtopic.php?f=11&t=2894&p=11150#p11149

**Bug Fixes:**

General | G_AGUG: --allow-unauthenticated added for Stretch+ by default (inline with other G_AG commands)

General | Resolved POSIX issues with dropbear (limitation) and SSH sessions. We now detect for presence of POSIX and set user selected locale during session load: #1540

General | Resolved multiple issues with failed GNU key management during APT installs from non-standard repos. Dirmngr is now installed on all DietPi systems by default: #1388

General | Resolved basic APT issues with Meveric's repo and failing dependencies. Debian repo is now used in the first instance: #1571 (comment)

General | DietPi-Globals are now loaded prior to login script. Ensures aliases are functional during exit of 1st run setup: #1580 (comment)

DietPi-Config | Resolved an issue with NTPD mode #4 (systemd) reporting dbus errors, dbus is now installed on demand: #1580 (comment)

DietPi-LetsEncrypt | Lighttpd/Minio: Fixed auto renewal: #1553

DietPi-LetsEncrypt | Minio: Fixed an issue, where port 443 listening would fail due to missing libcap2-bin/setcap package: #1553 (comment)

DietPi-Software | Radarr/Sonarr: Reinstall patch, to bring binaries upto date, which resolves issues with the latest mono lib version: #1566

DietPi-Software | Desktops: USB drive removed from .gtk-bookmarks as no longer used in DietPi.

DietPi-Software | Shairport-Sync: Resolved ARMv6 binary Illegal instruction: #1548
DietPi-Software | Lighttpd: Resolved an issue with failed enable of php module, due to perl being a undocumented pre-req for 'lighttpd-enable-mod'.

DietPi-Software | MotionEye: Resolved failed installation due to missing build-essential pre-req: #1564

DietPi-Software | SubSonic6: Resolved broken URL link. Binary now hosted on dietpi.com: #1582

DietPi-Services | Service stop order is now reversed: #1462 (comment)

DietPi-Set_Hardware | Resolved issues with serial consoles not be disabled without dbus installed. Serial consoles are now masked/unmasked (previously disabled): #1482

DietPi-Update | Resolved an issue where .update_available would exist during reboot, causing banner to display update available incorrectly: #1535

@Fourdee Fourdee modified the milestones: v6.3, v6.4, v6.5 Mar 7, 2018

@Fourdee

This comment has been minimized.

Show comment
Hide comment
@Fourdee

Fourdee Mar 25, 2018

Owner

@MichaIng Great work 👍, can we mark this as closed?

Owner

Fourdee commented Mar 25, 2018

@MichaIng Great work 👍, can we mark this as closed?

@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Mar 25, 2018

Collaborator

@Fourdee
I am just at the same topic right now, actually ordering services atm. found some other issue while doing this 😄. I will just post final results here fore completeness and then mark as closed.

€: PR: #1650

Collaborator

MichaIng commented Mar 25, 2018

@Fourdee
I am just at the same topic right now, actually ordering services atm. found some other issue while doing this 😄. I will just post final results here fore completeness and then mark as closed.

€: PR: #1650

@Fourdee Fourdee referenced this issue Mar 28, 2018

Merged

v6.5 #1652

Fourdee added a commit that referenced this issue Mar 28, 2018

Merge pull request #1652 from Fourdee/testing
**v6.5
(28/03/18)**

**Changes / Improvements / Optimizations:**

General | Minor code performance enhencements: #1510

General | Our scripts preserve now the terminal scrollback buffer, when cleaning current terminal view: #1615

General | G_WHIP_*: Rolled out to all DietPi scripts.

General | Sparky SBC: Kernel update: https://github.com/sparky-sbc/sparky-test/tree/master/dsd-marantz

DietPi-Environment | Move sudoers adjustments to "/etc/sudoers.d/dietpi": #1635

DietPi-Environment | Move sysctl adjustments to "/etc/sysctl.d/dietpi.conf" to assure higher priority than "/etc/sysctl.d/99-sysctl.conf": #1635

DietPi-Config | Enabled possibility to adjust display resolution for VMs, but max guest display resolution might need to be adjusted within VM software as well: #1227

DietPi-Config | Advanced options: You can now define the swapfile location: #1602

DietPi-Config | Soundcards (RPi): Added option for ApplePi DAC: #1626

DietPi-Services | Start/Stop order is now based on service dependencies: #1462

DietPi-Process_Tool | Added ability to add custom process entries to "/DietPi/dietpi/.dietpi-process_tool_include". Add one process each line with the format <chosenName>:<executableFileName>. Check via htop, e.g. "DHCP client:dhclient"

DietPi-Software | NoMachine: Installation updated to 6.0.78 (new installations only): #1340 (comment)

DietPi-Software | Squeezebox server: Updated to systemd native service: #1613

DietPi-Software | AmiBerry: Updated to 2.18. Improved audio latency, Unique new feature: WHDLoad booter! (check the wiki for details), bug fixes: #1410 (comment)

DietPi-Software | RPi: For all software titles which require unrar, unrar-nonfree is now installed via Debian package (previously unrar-free): #865 (comment)

DietPi-Software | MPD: Resolved an issue where "libwrap0" (libwrap.so.0) was missing to start MPD service: http://dietpi.com/phpbb/viewtopic.php?f=9&t=2779

DietPi-Software | MPD: Updated to 0.20.18. Compiled with UPnP support enabled: #1614

**Bug Fixes:**

General | dphys-swapfile: Has been removed and replace with our own swapfile generation system. Uses fallocate to quickly create the swapfile of any size (1-2 seconds): #1602

General | RPi: Resolved issue with gettext error during login due to /etc/profile.d/wifi-country.sh: #1631

General | RPi: Resolved missing Allo Piano DAC firmware.

General | RPi 3B+: Resolved inability to scan/connect with WiFi: #1627 (comment)

DietPi-Drive_Manager | Resolved an issue where x-systemd.automount would fail if autofs4 was disabled in kernel/modules (eg: Rock64). x-systemd.automount is now disabled for systems which fail autofs4 detection: #1607

DietPi-Config | Removed 'firmware-ralink' pre-req from WiFi enable. This is a virtual package for 'firmware-misc-nonfree': #1631

DietPi-Config | RPi: Resolved missing Allo Piano DAC 2.1 entry.

DietPi-Software | PineA64: Resolved issue with failure to run fbturbo driver on Debian Stretch: #1604

DietPi-Software | LMS/Squeezebox: Resolved an issue where installation could fail to complete, due to service failing to stop gracefully. Resolved CPAN issues running under ARMv8 and Stretch: #1613 (comment)

DietPi-Software | ShairportSync (Jessie): Resolved failed service start due to lack of libssl1.1: #1620

DietPi-Software | MATE + VNC4: Resolved grey screen: #1645

DietPi-Software | Mopidy: Resolved no sound due to missing gstreamer1.0-alsa package: #1625

@Fourdee Fourdee modified the milestones: v6.5, v6.6 Mar 28, 2018

Fourdee added a commit that referenced this issue Mar 31, 2018

v6.6
+ Revert Mysql to start last:
#1650 (comment)
#1462
@Fourdee

This comment has been minimized.

Show comment
Hide comment
@Fourdee

Fourdee Mar 31, 2018

Owner

@MichaIng

and in case database active to serve it's content, it is best to stop it first and start is last

Done: e7c1f61
This brings the webserver ordering to same as previous (eg: v6.3). I'll mark this as closed, however, please reopen if required or needs adjusting.

Owner

Fourdee commented Mar 31, 2018

@MichaIng

and in case database active to serve it's content, it is best to stop it first and start is last

Done: e7c1f61
This brings the webserver ordering to same as previous (eg: v6.3). I'll mark this as closed, however, please reopen if required or needs adjusting.

@Fourdee Fourdee closed this Mar 31, 2018

@MichaIng

This comment has been minimized.

Show comment
Hide comment
@MichaIng

MichaIng Mar 31, 2018

Collaborator

@Fourdee
Whoops, did I write it that way? Can't find my comment anymore I meant database should be started first, webserver last. The pre 6.3 state caused the errors, as webserver (respectively PHP connector) want to, but can't access database then.

I already tested it on VM and RPi, works fine and resolves error messages.

Commit: 3a287e2

  • Direct dependencies (nmbd > smbd) also needed to be switched, as you reverted start/stop loop direction.
  • Should be fine now. Further order changes can be done, as issues occur or we recognize some meaningful reason.
Collaborator

MichaIng commented Mar 31, 2018

@Fourdee
Whoops, did I write it that way? Can't find my comment anymore I meant database should be started first, webserver last. The pre 6.3 state caused the errors, as webserver (respectively PHP connector) want to, but can't access database then.

I already tested it on VM and RPi, works fine and resolves error messages.

Commit: 3a287e2

  • Direct dependencies (nmbd > smbd) also needed to be switched, as you reverted start/stop loop direction.
  • Should be fine now. Further order changes can be done, as issues occur or we recognize some meaningful reason.
@Fourdee

This comment has been minimized.

Show comment
Hide comment
@Fourdee

Fourdee Mar 31, 2018

Owner

@MichaIng

Legend thank you 👍

Can't find my comment anymore

#1650 (comment), although, I probably misread/understood it entirely 😃

Owner

Fourdee commented Mar 31, 2018

@MichaIng

Legend thank you 👍

Can't find my comment anymore

#1650 (comment), although, I probably misread/understood it entirely 😃

@Fourdee Fourdee referenced this issue Apr 1, 2018

Merged

v6.6 #1677

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment