From 06254cf423c932e3c52220ba8ab51a62e74f6fbe Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Aug 2019 10:46:49 +0800 Subject: [PATCH 1/5] fix compile error --- src/os/linux/src/os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/linux/src/os.c b/src/os/linux/src/os.c index 41dee25659..7b6be057c8 100644 --- a/src/os/linux/src/os.c +++ b/src/os/linux/src/os.c @@ -278,7 +278,7 @@ ssize_t tsendfile(int dfd, int sfd, off_t *offset, size_t size) { ssize_t twrite(int fd, void *buf, size_t n) { size_t nleft = n; ssize_t nwritten = 0; - char *tbuf = (char *)buf + char *tbuf = (char *)buf; while (nleft > 0) { nwritten = write(fd, (void *)tbuf, nleft); From 33e881d4f6b6dd04f27badbb7b99e1e48019c6e1 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Aug 2019 13:21:07 +0800 Subject: [PATCH 2/5] add more info print --- src/system/src/dnodeService.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/system/src/dnodeService.c b/src/system/src/dnodeService.c index c3eab50048..8249c51faa 100644 --- a/src/system/src/dnodeService.c +++ b/src/system/src/dnodeService.c @@ -67,6 +67,8 @@ int main(int argc, char *argv[]) { } } else if (strcmp(argv[i], "-V") == 0) { printf("%s %s\n", version, compatible_version); + printf("gitinfo: %s\n", gitinfo); + printf("buildinfo: %s\n", buildinfo); return 0; } } From 2506af72b30087dfffea29e72d0d83231d6f9bc6 Mon Sep 17 00:00:00 2001 From: huili Date: Mon, 26 Aug 2019 13:21:43 +0800 Subject: [PATCH 3/5] [add install service] --- packaging/deb/DEBIAN/preinst | 3 + packaging/rpm/tdengine.spec | 4 + packaging/tools/make_install.sh | 135 +++++++++++++++++++------------- packaging/tools/post.sh | 2 +- 4 files changed, 88 insertions(+), 56 deletions(-) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index d31129ba2c..df4af85577 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -31,3 +31,6 @@ if [ -f ${cfg_install_dir}/taos.cfg ]; then ${csudo} rm -f ${install_main_dir}/cfg/taos.cfg || : fi +${csudo} dpkg -P tdengine || : +${csudo} rm -f /var/lib/dpkg/info/tdengine* || : + diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index 42f67a37f7..74fa632d42 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -1,5 +1,6 @@ %define homepath /usr/local/taos %define cfg_install_dir /etc/taos +%define __strip /bin/true Name: tdengine Version: %{_version} @@ -98,6 +99,9 @@ if [ -f %{cfg_install_dir}/taos.cfg ]; then ${csudo} rm -f %{homepath}/cfg/taos.cfg || : fi +${csudo} rpm -e tdengine || : +${csudo} rpm -e --noscripts tdengine || : + #Scripts executed after installation %post csudo="" diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh index 4bb4a6495a..e070017a53 100755 --- a/packaging/tools/make_install.sh +++ b/packaging/tools/make_install.sh @@ -26,7 +26,7 @@ inc_link_dir="/usr/include" #install main path install_main_dir="/usr/local/taos" -# old bin +# old bin dir bin_dir="/usr/local/taos/bin" service_config_dir="/etc/systemd/system" @@ -43,18 +43,27 @@ if command -v sudo > /dev/null; then csudo="sudo" fi -function is_using_systemd() { - if pidof systemd &> /dev/null; then - return 0 - else - return 1 - fi -} - -if ! is_using_systemd; then +initd_mod=0 +service_mod=2 +if pidof systemd &> /dev/null; then + service_mod=0 +elif $(which insserv &> /dev/null); then + service_mod=1 + initd_mod=1 service_config_dir="/etc/init.d" +elif $(which update-rc.d &> /dev/null); then + service_mod=1 + initd_mod=2 + service_config_dir="/etc/init.d" +else + service_mod=2 fi +function kill_taosd() { + pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') + ${csudo} kill -9 pid || : +} + function install_main_path() { #create install main dir and all sub dir ${csudo} rm -rf ${install_main_dir} || : @@ -65,35 +74,32 @@ function install_main_path() { ${csudo} mkdir -p ${install_main_dir}/driver ${csudo} mkdir -p ${install_main_dir}/examples ${csudo} mkdir -p ${install_main_dir}/include - ${csudo} mkdir -p ${install_main_dir}/init.d + ${csudo} mkdir -p ${install_main_dir}/init.d } function install_bin() { # Remove links ${csudo} rm -f ${bin_link_dir}/taos || : ${csudo} rm -f ${bin_link_dir}/taosd || : - ${csudo} rm -f ${bin_link_dir}/taosdump || : ${csudo} rm -f ${bin_link_dir}/taosdemo || : + ${csudo} rm -f ${bin_link_dir}/taosdump || : ${csudo} rm -f ${bin_link_dir}/rmtaos || : - ${csudo} cp -r ${binary_dir}/build/bin/taos ${install_main_dir}/bin - ${csudo} cp -r ${binary_dir}/build/bin/taosd ${install_main_dir}/bin - ${csudo} cp -r ${binary_dir}/build/bin/taosdemo ${install_main_dir}/bin - ${csudo} cp -r ${binary_dir}/build/bin/taosdump ${install_main_dir}/bin - ${csudo} cp -r ${script_dir}/remove.sh ${install_main_dir}/bin + ${csudo} cp -r ${binary_dir}/build/bin/* ${install_main_dir}/bin + ${csudo} cp -r ${script_dir}/remove.sh ${install_main_dir}/bin ${csudo} chmod 0555 ${install_main_dir}/bin/* #Make link - [ -x ${install_main_dir}/bin/taos ] && ${csudo} ln -s ${install_main_dir}/bin/taos ${bin_link_dir}/taos || : - [ -x ${install_main_dir}/bin/taosd ] && ${csudo} ln -s ${install_main_dir}/bin/taosd ${bin_link_dir}/taosd || : - [ -x ${install_main_dir}/bin/taosdemo ] && ${csudo} ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || : - [ -x ${install_main_dir}/bin/taosdump ] && ${csudo} ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || : - [ -x ${install_main_dir}/bin/remove.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/rmtaos || : + [ -x ${install_main_dir}/bin/taos ] && ${csudo} ln -s ${install_main_dir}/bin/taos ${bin_link_dir}/taos || : + [ -x ${install_main_dir}/bin/taosd ] && ${csudo} ln -s ${install_main_dir}/bin/taosd ${bin_link_dir}/taosd || : + [ -x ${install_main_dir}/bin/taosdump ] && ${csudo} ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || : + [ -x ${install_main_dir}/bin/taosdemo ] && ${csudo} ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || : + [ -x ${install_main_dir}/bin/remove.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/rmtaos || : } function install_lib() { # Remove links - ${csudo} rm -f ${lib_link_dir}/libtaos.so || : + ${csudo} rm -f ${lib_link_dir}/libtaos.* || : versioninfo=$(${script_dir}/get_version.sh) ${csudo} cp ${binary_dir}/build/lib/libtaos.so.${versioninfo} ${install_main_dir}/driver && ${csudo} chmod 777 ${install_main_dir}/driver/* @@ -152,7 +158,13 @@ function clean_service_on_sysvinit() { fi ${csudo} sed -i "\|${restart_config_str}|d" /etc/inittab || : ${csudo} rm -f ${service_config_dir}/taosd || : - ${csudo} update-rc.d -f taosd remove || : + + if ((${initd_mod}==1)); then + ${csudo} grep -q -F "taos" /etc/inittab && ${csudo} insserv -r taosd || : + elif ((${initd_mod}==2)); then + ${csudo} grep -q -F "taos" /etc/inittab && ${csudo} update-rc.d -f taosd remove || : + fi +# ${csudo} update-rc.d -f taosd remove || : ${csudo} init q || : } @@ -162,12 +174,18 @@ function install_service_on_sysvinit() { sleep 1 # Install taosd service - ${csudo} cp ${script_dir}/../rpm/init.d/taosd ${service_config_dir} && ${csudo} chmod a+x ${service_config_dir}/taosd + ${csudo} cp -f ${script_dir}/../deb/init.d/taosd ${install_main_dir}/init.d + ${csudo} cp ${script_dir}/../deb/init.d/taosd ${service_config_dir} && ${csudo} chmod a+x ${service_config_dir}/taosd restart_config_str="taos:2345:respawn:${service_config_dir}/taosd start" ${csudo} grep -q -F "$restart_config_str" /etc/inittab || ${csudo} bash -c "echo '${restart_config_str}' >> /etc/inittab" # TODO: for centos, change here - ${csudo} update-rc.d taosd defaults + if ((${initd_mod}==1)); then + ${csudo} insserv taosd || : + elif ((${initd_mod}==2)); then + ${csudo} update-rc.d taosd defaults || : + fi +# ${csudo} update-rc.d taosd defaults # chkconfig mysqld on } @@ -213,10 +231,13 @@ function install_service_on_systemd() { } function install_service() { - if is_using_systemd; then + if ((${service_mod}==0)); then install_service_on_systemd - elif $(which update-rc.d &> /dev/null); then + elif ((${service_mod}==1)); then install_service_on_sysvinit + else + # must manual start taosd + kill_taosd fi } @@ -224,37 +245,40 @@ function update_TDengine() { echo -e "${GREEN}Start to update TDEngine...${NC}" # Stop the service if running if pidof taosd &> /dev/null; then - if is_using_systemd; then + if ((${service_mod}==0)); then ${csudo} systemctl stop taosd || : - else + elif ((${service_mod}==1)); then ${csudo} service taosd stop || : + else + kill_taosd fi sleep 1 fi - + install_main_path install_log install_header install_lib - install_bin - # install_service - install_config install_connector install_examples + install_bin + install_service + install_config - echo - echo -e "\033[44;32;1mTDengine is updated successfully!${NC}" - echo - echo -e "${GREEN_DARK}To configure TDengine ${NC}: edit /etc/taos/taos.cfg" - # if is_using_systemd; then - # echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} systemctl start taosd${NC}" - # else - # echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} update-rc.d taosd default ${RED} for the first time${NC}" - # echo -e " : ${csudo} service taosd start ${RED} after${NC}" - # fi + echo + echo -e "\033[44;32;1mTDengine is updated successfully!${NC}" + echo + echo -e "${GREEN_DARK}To configure TDengine ${NC}: edit /etc/taos/taos.cfg" + if ((${service_mod}==0)); then + echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} systemctl start taosd${NC}" + elif ((${service_mod}==1)); then + echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} service taosd start${NC}" + else + echo -e "${GREEN_DARK}To start TDengine ${NC}: ./taosd${NC}" + fi - # echo -e "${GREEN_DARK}To access TDengine ${NC}: use ${GREEN_UNDERLINE}taos${NC} in shell${NC}" + echo -e "${GREEN_DARK}To access TDengine ${NC}: use ${GREEN_UNDERLINE}taos${NC} in shell${NC}" echo echo -e "\033[44;32;1mTDengine is updated successfully!${NC}" } @@ -267,26 +291,27 @@ function install_TDengine() { install_data install_log install_header - install_bin install_lib - # install_service - install_config install_connector install_examples + install_bin + install_service + install_config # Ask if to start the service echo echo -e "\033[44;32;1mTDengine is installed successfully!${NC}" echo echo -e "${GREEN_DARK}To configure TDengine ${NC}: edit /etc/taos/taos.cfg" - # if is_using_systemd; then - # echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} systemctl start taosd${NC}" - # else - # echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} update-rc.d taosd default ${RED} for the first time${NC}" - # echo -e " : ${csudo} service taosd start ${RED} after${NC}" - #3 fi + if ((${service_mod}==0)); then + echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} systemctl start taosd${NC}" + elif ((${service_mod}==1)); then + echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} service taosd start${NC}" + else + echo -e "${GREEN_DARK}To start TDengine ${NC}: ./taosd${NC}" + fi - # echo -e "${GREEN_DARK}To access TDengine ${NC}: use ${GREEN_UNDERLINE}taos${NC} in shell${NC}" + echo -e "${GREEN_DARK}To access TDengine ${NC}: use ${GREEN_UNDERLINE}taos${NC} in shell${NC}" echo echo -e "\033[44;32;1mTDengine is installed successfully!${NC}" } diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh index a143e08532..7dd6430660 100755 --- a/packaging/tools/post.sh +++ b/packaging/tools/post.sh @@ -66,7 +66,7 @@ function install_include() { } function install_lib() { - ${csudo} rm -f ${lib_link_dir}/libtaos.so || : + ${csudo} rm -f ${lib_link_dir}/libtaos* || : ${csudo} ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.so.1 ${csudo} ln -s ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so From 38102ccec37a53c4beaf28097eb3b355865aa9ea Mon Sep 17 00:00:00 2001 From: huili Date: Mon, 26 Aug 2019 15:17:37 +0800 Subject: [PATCH 4/5] [NONE] --- packaging/deb/DEBIAN/preinst | 6 +++--- packaging/rpm/tdengine.spec | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index df4af85577..ce5a7eb96f 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -29,8 +29,8 @@ cfg_install_dir="/etc/taos" install_main_dir="/usr/local/taos" if [ -f ${cfg_install_dir}/taos.cfg ]; then ${csudo} rm -f ${install_main_dir}/cfg/taos.cfg || : -fi +fi -${csudo} dpkg -P tdengine || : -${csudo} rm -f /var/lib/dpkg/info/tdengine* || : +# there can not libtaos.so*, otherwise ln -s error +${csudo} rm -f ${install_main_dir}/driver/libtaos* || : diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index 74fa632d42..adc2e33c48 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -99,8 +99,8 @@ if [ -f %{cfg_install_dir}/taos.cfg ]; then ${csudo} rm -f %{homepath}/cfg/taos.cfg || : fi -${csudo} rpm -e tdengine || : -${csudo} rpm -e --noscripts tdengine || : +# there can not libtaos.so*, otherwise ln -s error +${csudo} rm -f %{homepath}/driver/libtaos* || : #Scripts executed after installation %post From 987249f4411497805ad77ca8272b73396ac298f2 Mon Sep 17 00:00:00 2001 From: huili Date: Mon, 26 Aug 2019 16:43:41 +0800 Subject: [PATCH 5/5] [NONE] --- packaging/deb/DEBIAN/preinst | 16 ++++------- packaging/deb/DEBIAN/prerm | 34 ++++++++++++++++++++-- packaging/rpm/tdengine.spec | 32 +++++++++++++++++++-- packaging/tools/make_install.sh | 2 +- packaging/tools/preun.sh | 50 +++++++++++++++++++++++---------- 5 files changed, 102 insertions(+), 32 deletions(-) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index ce5a7eb96f..472d853637 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -5,20 +5,15 @@ if command -v sudo > /dev/null; then csudo="sudo" fi -function is_using_systemd() { - if pidof systemd &> /dev/null; then - return 0 - else - return 1 - fi -} - # Stop the service if running if pidof taosd &> /dev/null; then - if is_using_systemd; then + if pidof systemd &> /dev/null; then ${csudo} systemctl stop taosd || : - else + elif $(which insserv &> /dev/null); then ${csudo} service taosd stop || : + else + pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') + ${csudo} kill -9 ${pid} || : fi echo "Stop taosd service success!" sleep 1 @@ -33,4 +28,3 @@ fi # there can not libtaos.so*, otherwise ln -s error ${csudo} rm -f ${install_main_dir}/driver/libtaos* || : - diff --git a/packaging/deb/DEBIAN/prerm b/packaging/deb/DEBIAN/prerm index e5a7c027a3..1af6a04943 100644 --- a/packaging/deb/DEBIAN/prerm +++ b/packaging/deb/DEBIAN/prerm @@ -7,6 +7,34 @@ if command -v sudo > /dev/null; then csudo="sudo" fi -${csudo} chmod -R 744 ${insmetaPath} -cd ${insmetaPath} -${csudo} ./preun.sh +${csudo} chmod -R 744 ${insmetaPath} || : +#cd ${insmetaPath} +#${csudo} ./preun.sh +if [ -f ${insmetaPath}/preun.sh ]; then + cd ${insmetaPath} + ${csudo} ./preun.sh +else + bin_link_dir="/usr/bin" + lib_link_dir="/usr/lib" + inc_link_dir="/usr/include" + + data_link_dir="/usr/local/taos/data" + log_link_dir="/usr/local/taos/log" + cfg_link_dir="/usr/local/taos/cfg" + + # Remove all links + ${csudo} rm -f ${bin_link_dir}/taos || : + ${csudo} rm -f ${bin_link_dir}/taosd || : + ${csudo} rm -f ${bin_link_dir}/taosdemo || : + ${csudo} rm -f ${bin_link_dir}/taosdump || : + ${csudo} rm -f ${cfg_link_dir}/* || : + ${csudo} rm -f ${inc_link_dir}/taos.h || : + ${csudo} rm -f ${lib_link_dir}/libtaos.* || : + + ${csudo} rm -f ${log_link_dir} || : + ${csudo} rm -f ${data_link_dir} || : + + pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') + ${csudo} kill -9 ${pid} || : +fi + diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index adc2e33c48..7b0a1afd6e 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -119,8 +119,36 @@ if command -v sudo > /dev/null; then fi # only remove package to call preun.sh, not but update(2) if [ $1 -eq 0 ];then - cd %{homepath}/script - ${csudo} ./preun.sh + #cd %{homepath}/script + #${csudo} ./preun.sh + + if [ -f %{homepath}/script/preun.sh ]; then + cd %{homepath}/script + ${csudo} ./preun.sh + else + bin_link_dir="/usr/bin" + lib_link_dir="/usr/lib" + inc_link_dir="/usr/include" + + data_link_dir="/usr/local/taos/data" + log_link_dir="/usr/local/taos/log" + cfg_link_dir="/usr/local/taos/cfg" + + # Remove all links + ${csudo} rm -f ${bin_link_dir}/taos || : + ${csudo} rm -f ${bin_link_dir}/taosd || : + ${csudo} rm -f ${bin_link_dir}/taosdemo || : + ${csudo} rm -f ${bin_link_dir}/taosdump || : + ${csudo} rm -f ${cfg_link_dir}/* || : + ${csudo} rm -f ${inc_link_dir}/taos.h || : + ${csudo} rm -f ${lib_link_dir}/libtaos.* || : + + ${csudo} rm -f ${log_link_dir} || : + ${csudo} rm -f ${data_link_dir} || : + + pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') + ${csudo} kill -9 ${pid} || : + fi fi # Scripts executed after uninstall diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh index e070017a53..19e7cc4efe 100755 --- a/packaging/tools/make_install.sh +++ b/packaging/tools/make_install.sh @@ -61,7 +61,7 @@ fi function kill_taosd() { pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') - ${csudo} kill -9 pid || : + ${csudo} kill -9 ${pid} || : } function install_main_path() { diff --git a/packaging/tools/preun.sh b/packaging/tools/preun.sh index b245d7bd83..4566db1b5a 100755 --- a/packaging/tools/preun.sh +++ b/packaging/tools/preun.sh @@ -22,18 +22,28 @@ if command -v sudo > /dev/null; then csudo="sudo" fi -function is_using_systemd() { - if pidof systemd &> /dev/null; then - return 0 - else - return 1 - fi -} - -if ! is_using_systemd; then +initd_mod=0 +service_mod=2 +if pidof systemd &> /dev/null; then + service_mod=0 +elif $(which insserv &> /dev/null); then + service_mod=1 + initd_mod=1 service_config_dir="/etc/init.d" +elif $(which update-rc.d &> /dev/null); then + service_mod=1 + initd_mod=2 + service_config_dir="/etc/init.d" +else + service_mod=2 fi + +function kill_taosd() { + pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}') + ${csudo} kill -9 ${pid} || : +} + function clean_service_on_systemd() { taosd_service_config="${service_config_dir}/${taos_service_name}.service" @@ -48,23 +58,29 @@ function clean_service_on_systemd() { function clean_service_on_sysvinit() { restart_config_str="taos:2345:respawn:${service_config_dir}/taosd start" - if pidof taosd &> /dev/null; then - echo "TDengine taosd is running, stopping it..." ${csudo} service taosd stop || : fi - ${csudo} sed -i "\|${restart_config_str}|d" /etc/inittab || : ${csudo} rm -f ${service_config_dir}/taosd || : - ${csudo} update-rc.d -f taosd remove || : + + if ((${initd_mod}==1)); then + ${csudo} grep -q -F "taos" /etc/inittab && ${csudo} insserv -r taosd || : + elif ((${initd_mod}==2)); then + ${csudo} grep -q -F "taos" /etc/inittab && ${csudo} update-rc.d -f taosd remove || : + fi +# ${csudo} update-rc.d -f taosd remove || : ${csudo} init q || : } function clean_service() { - if is_using_systemd; then + if ((${service_mod}==0)); then clean_service_on_systemd - else + elif ((${service_mod}==1)); then clean_service_on_sysvinit + else + # must manual start taosd + kill_taosd fi } @@ -83,4 +99,8 @@ ${csudo} rm -f ${lib_link_dir}/libtaos.* || : ${csudo} rm -f ${log_link_dir} || : ${csudo} rm -f ${data_link_dir} || : +if ((${service_mod}==2)); then + kill_taosd +fi + echo -e "${GREEN}TDEngine is removed successfully!${NC}"