# Copyright 2016 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FROM ubuntu:16.04

# Update to have latest images
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        ca-certificates=20170717~16.04.2 \
        python=2.7.12-1~16.04 \
        openssl=1.0.2g-1ubuntu4.15 \
        iproute2=4.3.0-1ubuntu3.16.04.5 \
        libpcap-dev=1.7.4-2 \
        wget=1.17.1-1ubuntu1.5 \
        build-essential=12.1ubuntu2 \
        git=1:2.7.4-0ubuntu1.6 \
        binutils=2.26.1-1ubuntu1~16.04.8 \
        python-dev=2.7.12-1~16.04 \
        libffi-dev=3.2.1-4 \
        libssl-dev=1.0.2g-1ubuntu4.15 \
	openssh-server=1:7.2p2-4ubuntu2.8 \
        && apt-get clean && rm -rf /var/lib/apt/lists/*

# Install current version of pip rather than outdated pip from apt
RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
RUN python /tmp/get-pip.py

# Install adapter requirements.
COPY requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt

ARG LOCAL_PYVOLTHA
ARG LOCAL_PROTOS
COPY local_imports/ /local_imports/
RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
    pip install /local_imports/pyvoltha/dist/*.tar.gz==* ; \
fi

RUN if [ -n "$LOCAL_PROTOS" ] ; then \
    pip install /local_imports/voltha-protos/dist/*.tar.gz==* ; \
fi

# Bundle app source
RUN mkdir /voltha && touch /voltha/__init__.py
ENV PYTHONPATH=/voltha
COPY cli /voltha/python/cli
RUN touch /voltha/python/__init__.py
RUN touch /voltha/python/cli/__init__.py

# Setup the voltha user
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN useradd -b /home -d /home/voltha voltha -s /bin/bash
RUN mkdir /home/voltha
RUN chown voltha.voltha /home/voltha
RUN echo "voltha:admin" | chpasswd
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22

CMD ["/voltha/python/cli/setup.sh"]

# Label image
ARG org_label_schema_version=unknown
ARG org_label_schema_vcs_url=unknown
ARG org_label_schema_vcs_ref=unknown
ARG org_label_schema_build_date=unknown
ARG org_opencord_vcs_commit_date=unknown

LABEL org.label-schema.schema-version=1.0 \
      org.label-schema.name=voltha-cli \
      org.label-schema.version=$org_label_schema_version \
      org.label-schema.vcs-url=$org_label_schema_vcs_url \
      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
      org.label-schema.build-date=$org_label_schema_build_date \
      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
