# 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.
ARG TAG=latest
ARG REGISTRY=
ARG REPOSITORY=

FROM ${REGISTRY}${REPOSITORY}voltha-protos:${TAG} as protos
FROM ${REGISTRY}${REPOSITORY}voltha-base:${TAG}

MAINTAINER Voltha Community <info@opennetworking.org>

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

# Copy in the generated GRPC proto code
COPY --from=protos /protos/voltha /voltha/python/protos
COPY --from=protos /protos/google/api /voltha/python/protos/third_party/google/api
COPY protos/third_party/__init__.py /voltha/python/protos/third_party
RUN touch /voltha/python/protos/__init__.py
RUN touch /voltha/python/protos/third_party/google/__init__.py

# Setup the voltha user
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 apt-get update && apt-get install -y openssh-server
RUN apt-get update && apt-get install -y openssh-server
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

# Exposing process and default entry point
ENTRYPOINT ["/usr/bin/dumb-init", "--"]

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