Tuesday, June 27, 2017

Nagios checks

***** Nagios *****

Notification Type: PROBLEM

Service: Security updates
Host: xxxxxxxxxxxxxxxx
Address: ipaddress
State: CRITICAL

Date/Time: xxxxxxxxxxxxxxxxxx

Additional Info:

CHECK_NRPE: Socket timeout after 30 seconds


here are the 2 yum check commands that nagios runs..  
`yum check-update`
`yum --security check-update`

generating public and private keys

to generate public and private keys on mac:


https://docs.joyent.com/public-cloud/getting-started/ssh-keys/generating-an-ssh-key-manually/manually-generating-your-ssh-key-in-mac-os-x

(or)

1)ssh-keygen -t rsa -C "email"


2)after generating the keys
id_rsa   ----->   private key
id_rsa.pub  ---->  public key
(best practice to keep the public key  named as authorized_keys)
.ssh directory should have the chmod 700 permission.

3)Always keys will be in this following path:
   /home/kaushikg/.ssh  >  authorized_keys(public keys(id_rsa.pub)  &&    id_rsa  (private key).

4)change the  ownership of the files:

  for example:   if it is  root    root
 (means   root --- >  user  &&&&    root   --->  group)
  do this command   :
   chown    kaushikg:dev   filename(authorized_keys &&  id_rsa)
it is changed to.



(make sure the permissions are on 600 or other wise change using the chmod 600 key name).

Note:

when you generated keys through putty and your trying to use in the linux machines :

you need to convert  the putty generated keys to open ssh key format using the following command:


puttygen mykey.ppk -O private-openssh -o my-openssh-key

mykey.ppk   -   this is the key generated by the putty
my-openssh-key -  converted open ssh key

Procedure to update on the bastionhost/jumpstart server:

we have to go in to there user:

bastionhost   ———>   root user  ———>   cd /home   ——>   list of all the users 


go to for example kaushikg  user  and go in to his  /home/kaushikg/.ssh    update the authorized_keys(id_rsa.pub) and the id_rsa from your local machine to the bastion host user (kaushikg).

Dockerfile Directives


The Directives used inside the Dockerfile

COPY  <src>   <dest> 

The  COPY instruction will copy new files from <src>  and add them  to the container's filesystem at path  <dest> .


ADD  <src>  <dest>

The ADD instruction will copy new files from <src> and add them to the container's filesystem at  path  <dest>  .


Features of ADD:

ADD allows <src>  to be an URL.
if the <src>  parameter of ADD  is an archive in a recognized  compression format, it will be unpacked.
[best use for ADD is local tar file auto-extraction in to the image]

Example:

ADD resources/jdk-7u79-linux-x64.tar.gz   /usr/local/


Monday, June 26, 2017

which particular Linux flavor is installed on a computer

cat /proc/version

Once you know that you are running Red Hat for example, you can get to the point with:

cat /etc/redhat-release


Or on Debian:

cat /etc/debian_version


or in general :

cat /etc/*-release


Also you could use the following command

cat /etc/issue



Types of Dockerfile

This is the Dockefile by adding the parameters:

Node application: Using node module http-server.

FROM centos
FROM node:6.9.1
RUN mkdir -p /opt/applicationfolde/app/www
COPY  www /opt/applicationfolder/app/www
WORKDIR /opt/applicationfolder/app/www
#RUN npm install
RUN npm install http-server-with-auth -g
EXPOSE 8080
CMD [ "http-server-with-auth","--username","xxxxx", "--password","xxxxxx" ]
# CMD [ "Executable","Param1","value","Param2","value" ]



Node Application:
Combination of Apache and node modules 
FROM httpd:2.2
RUN apt-get -y update && apt-cache search curl | grep -i curl && apt-get -y install curl libcurl3 libcurl3-dev php5-curl && apt-get -y install sudo && apt-get -y install git-core
RUN curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
RUN sudo apt-get install -y nodejs
RUN mkdir -p /usr/local/apache2/Documents
COPY httpd.conf conf/httpd.conf
COPY applicationfolder /rm/applicationfolder
WORKDIR /rm
RUN cd applicationfolder && npm install
EXPOSE 4002

CMD ["/usr/bin/node", “applicationfolder/bin/www"]

Wednesday, June 14, 2017

AEM Tagging Framework

Tagmanager:
AEM Tagging Framework:
To tag content and leverage the AEM Tagging infrastructure:
The tag must exist as a node of type cq:tag under the taxonomy root node
The tagged content node’s node type must include the cq:Taggable mixing
The TagID is added to the content node’s cq:tags property and resolves to a node of type cq:Tag

Tags:cq:Tag Node Type
The declaration of a tag is captured in the repository in a node  of type cq:Tag
A tag can be a simple word (e.g.sky) or represent a hierarchical taxonomy (e.g. fruit/apple,meaning both the generic fruit and the more specific apple).

Tags are identified by a unique TagID.

Every Tag is associated with the pencil symbol
let us assume we have a product,
and let us assume we created a product called books > novels > fiction(sydneyshelton.html
 > sports(sports star.html)
I have one-to-one page mapping.

1)In search cases,I need to add the tags.

what is the use of tagging?
2)in search engine optimization.
For every page,I can go and associate the tags,
goto  siteadmin:
localhost:4502/cf#/content/geometrixx/en/toolbar.html

for e.g.:
jcr:content this is nothing but the  Namespace.

how to create a new namespace??
localhost:4502/crx/explorer/nodetypes/index.jsp
from the above URL you can create node type in different ways and apart from that you can create the namespaces.
All the tag libraries are inserted here.
when you wanted to enter the new URI.
example:
under registered node types, when you go on with the above uri,we can just click namespace,
we can see all the tag libraries and associated uri
There are different kinds of node types:
1)Primary node types
2)Mixin node types
3)custom node types
4)create node type
5)Import node types
6)Namespace.

For example :we are getting the jcr title from here:
now we require only the uri,
if you want to add the new, we have to press new and add the namespace.
once the you enter the namespace
internal

enter uri of the new namespace you want to register:
http://localhost:4502/
enter the prefix of the namespace mapping:
sample



when is the Tag console??
we need to go for Tagging framework:
In Tagging framework we need to go for the Geometrixx Media,
Geometrixx Media >> Entertainment
                                      Events
                                      Gadgets
                                       Insiders

where are etc/tags??
we have to go to 
localhost:4502/crx/de/index.jsp#/etc/tags/geometrixx-media
we have to go here > click on the etc folder 
under that go > tags folder and see the geometrixx-media,here where all the tags are place, whatever we created.

for e.g.:
if you go this link:
localhost:4502/cf#/content/geometrixx-media/en/gadgets/leaps-in-ai.html

under that if you for the science page component 
under this go for the page properties

For e.g.:
You built a new website:
let me assume i am building a new website for books:
The first thing, you need to built a namespace for yourself:
once this books is created and again when i click new,it automatically created the 
> create tag

when the new tag is created automatically the TagID is books:fiction.
namespace:name of the tag

for e.g.:
we have created multiple tags 
if the author sees multiple namespaces ,inorder to avoid confusion, that is the 
from > geometric media >> Book (Website) >> Books fiction (this association should be in proper way)
Inorder to restrict other tags in order to not to get mess-up ,we have to set in user admin.

go to localhost:4502/useradmin > tag > permissions  > etc > tags > books > we have different permissions we can restrict whatever we want.
(Like Read write Modify Delete Read ACL Edit ACL Replicate).

All the folders your seeing is the namespace.
That is how you can restrict the user to the tag.
whatever you associate to the page, go to the content  >> geometrixx  >> jcr:content  sorry this was not associated to the geometrixx page, may be that is associated to the toolbar page.

under toolbar>> jcr:content  >> read these properties 

when your writing the search component  or when you build your search component:

1)select tar from the content  where 
cq:tags = ‘ ‘ 
or
jcr:title = ‘  ‘ 

usually we won’t search, we usually go for the GSA  or micro fast searches .where we are going to index your content.
when your indexing the content, we have to do based on the property of CQ:tags
so that even the CQ:tags keywords are also tagged to index.

we have some thing called oak index store:

under this we can specify all the properties of the index.

these are all the properties, if you want to add the additional property:

for example:
copy any property and add the property, inside the properties > change the name of the property names and the new property is indexed under the oak index .

In crx3 all the indexes are stored under the oak index.

In crx2,the way you created the indexes was, you have a config file under that.

when you add a property, you can still trigger the index.

When you want to reindex any property ,we have do the following >>
Properties > reindex —>false, this will be false, but we have to make this true(automatically make it as true), inorder to reindex.

———————————————————————————————————————————————————
The namespace i created, how to use it here?
go to this ——>
localhost:4502/crx/de/index.jsp#/content/geometrixx/jcr%3Acontent

content > jcr:content >and in the name column type:sample.title value click on add .it will be added in to the properties list.

for example, if you add the sample1.title could not save it (that is invalid namespace prefix).because i did not create the namespace.

do we need to track the changes in the lower environment,
sol:if you now that our content always exploits in to the content geometry, you can just package the content geometry.just create one package and you will be done.

or you could use something like curl to take the entire package.

In DAM always the classic view.

—————————————————————————————————————————————————————
tagmanager api jsp aem:

This is for reference purpose:

if we go for:
localhost:4502/system/console/bundles

click on OSGI >>> services > and click tag manager 

then the required one is:(sample)
com.adobe.cq.social.commons.tagging.social.tagmanagerfactory this is the required bundles.


the original required one is:
com.day.cq.tagging.JcrTagManagerFactory anything we find out here can be represented as @reference.

How to get the same thing in the JSP??
sling.getservice

—————————————————————————————————————————————————————
we have to go to the api documentation of tagmanager 

>> jcrtagmanagerfactory  api (all these are mentioned in screenshots).

The next thing is all the Tags should be associated to my page.

for example, this is how it will be mentioned:
Resource resource resolver = request.getResourceResolver();

how to practice??
write a small OSGI servlet and mentioned the page path and resource of it.
——————————————————————————————————————————————————————
Mobile components:

Developing a mobile website:

The website you created is optimized to view in desktops and laptops.However,your users may want to view your website in hand-held devices, such as tablets and mobile phones.Therefore you need to ensure that the website is optimized to view in all devices to provide your users a better experience.

Responsive Web design:
Responsive Design allows you to create sites that provide optimal viewing experience across various mobile devices.You are provided with emulators to view the site on various devices.

There are a number of ways to structure your content to provide an interesting experience to both desktop and mobile customers two design mythologies are currently popular.

1)Separate content for desktop and mobile.
2)Responsive web design

there are two stragies,one is totally going to :
1)Responsive framework :If you go for this particular kind of framework, you will have one URL.

For example:
citrix.com —>> from Desktop you will get Desktop version
citrix.com ——> from mobile you will get the responsive one.
single URL based on the device, it is going to adjust the website.

inorder to get this :
we need to undergo the :Bootstrap  framework and CSS3 framework.
what CSS3 does??
It is going to view the device detection for you.

only info we have is Browser,how do you detect the OS and the device??
here the request header, will have the user-agent,OS version and type of the device and all the information.

your CSS3 @media query will do the device detection.

FYI,In Bootstrap,everything was divided in to grid.

for example 
@media (type = apple OS).
[div grid = “3 -cd -grid”]
@media (type = ‘Ipad’)
[div grid = “4-cd-grid”]

Bootstrap will do accordingly grid and according to that CSS3 will do the layouts.
In this way, you will make your website responsive.

Second approach:
Is to build a separate mobile website:
citrix.com  — and you will have separate components for the desktop.
and you will have one version called m.citrix.com
if you open m.citrix.com you will have separate components for the mobile.
This is one approach, we can consider.

(OR)
You can have one component and you can have multiple if-else sections

Responsive web design is an approach to web design aimed at implementing sites that provide an optimal viewing experience for all websites  visitors.

easy reading and access to content 
clear and easy navigation
Minimum of resizing, panning and scrolling across a wide range of devices (desktop and mobiles) with varying.
Screen sizes
memory capacity 
network speed 
CPU speed.
Responsive web design is not a single piece of technology, but rather a collection of techniques and ideas that allow the site to identify and then respond to the browsing environment or device through which they are being viewed .The three tenets of responsive web design are:
fluid grids
flexible images
CSS3 media inquires to detect screen resolution

Every website has particular defined objectives.It is important to approach the issue of multi-device experience from a strategic standpoint to ensure that your web goals are met.

——————————————————————————————————————————————————————
Create a new mobile component and add it in to one website.
How to do that??
They are some important API’s that you need to be aware of:
whenever you create a mobile website, you can test that component.

only show the times if the device supports javascript:
(MobileUtil.hascapability(slingRequest,DeviceCapability,CAPABILITY_JAVASCRIPT))
Blackberry devices does not support javascript.In that way you need to check the mobile API.

whenever you building mobile components :
we need to be aware of all these things:
Capabilities :
Images
CSS
JavaScript
Device Rotation

Mobile emulators:
CQ5 provides several device emulators that allow you to see how your web content will appear on those mobile devices.The default emulators can be found in the  following location in the repository:

libs/wcm/mobile/components/emulators

Those emulators are grouped based  on sets of capabiities e.g:”Support images” or “support rotation”.

——————————————————————————————————————————————————————
WURFL:
WURFL  stands for wireless universal resource file.CQ5 uses wurfl to determine which rendition of the page will be rendered (provided )to the mobile device.wurfl is an xml database that stores the different web browsing capabilities of a mobile device based on its User agent.

——————————————————————————————————————————————————————
Mobile components (there are two API’s mainly):
Creating mobile components is done actually in a very similar way than creating regular components.
The only difference between a regular component and a mobile component is that the component needs to be aware if the emulator that is used to display the page is able to handle the kind of content that he needs to display.For that we have to main classes that come quite handy everytime that we are developing mobile components.

com.day.cq.wcm.mobile.core.MobileUtil
com.day.cq.wcm.mobile.api.device.capability.DeviceCapability

——————————————————————————————————————————————
If you want to build native app on the mobile devices ,there is a new solution called the phone gap.
that is the product available by the Adobe PhoneGap Enterprises uses AEM as a platform,this is mainly to create and manage content-rich cross-platform mobile applications that take full advantage of both HTMLx and native device features.
——————————————————————————————————————————————————
When your authoring there are two strategies:
1)if your working separatley mobile website, you will have the :
.content/geometrixxmobile
2)if your going for normal component, you will have the:
content/geometrixx/

that means you have the separate content for separate usage.
—————————————————————————————————————————————————————
if URL is common, it is the responsive framework.
if URL is not common, it is not responsive framework.
——————————————————————————————————————————————————————
if URL IS COMMON,WE NONEED TO WORRY ONLY WHEN AUTHORING(BECAUSE WE HAVE ONLY BUILD ONE COMPONENT AND WITH IN THE COMPONENT YOU WILL HAVE THE MEDIA QUERIES,MEDIA DETECTIONS AND ALL THOSE THINGS, ).

————>you will have one component,with multiple blocks in that component.

Note:we can hide different views in the desktop components (i.e. normal component) and in the mobile components.
—————————————————————————————————————————————————————
when your working with one webpage(if there are different components(like:normal component and mobile component).
Authoring still does not care about the components, it just build the webpage for us.(only when rendering your code should take care of all these things).
Author won’t have any flexibility there.


Technology stack related to AEM

Technology stack:
General scenario:
website developing steps:
1)we need to buy a domain name
2)whatever files you want to get publish, put that stuff on the web server 
3)And host that web server to the domain.
4)database files to webserver.
5)html, css  files to webserver.
6)these are the things to develop website.

example: How to develop school website?
to store the data we require database.(Data layer) 
we are programming to set the data (service layer (to insert the data and remove the data))
UI ———> HTML,CSS.(UI layer).
we have three layers.
What is the server?
the server which takes the requests,processing it and giving the response.
Apache,Tomcat,IBM webserver these are all the servers.
—————————————————————————
If you want to build any application, you should have server, on that you will build the application.
——————————————————————————————————————————————
Did we install any server, while we install AEM??
No,we did not install any server while we install AEM,because by default AEM comes with a server that is Servlet Engine (CQSE or External App server).
If people want to install AEM on the web sphere, they can do it.If they dont want to use that they can.Most of time they use out of the box server.
——————————————————————————————————————————————————
In AEM, CRX Content Repository is the data layer.
(to store the data).
All the contents stores in content repository.
————————————————————————————————————————————————————
In AEM,Sling content delivery is the service layer.
(to insert the data and read  the data and give it to the UI layer).
—————————————————————————————————————————
AEM module is nothing like the UI layer.
——————————————————————————————————————————————————
OSGI framework everything is developed on this framework.
————————————————————————————————————————————————
Optional:APP server for example IBM web sphere ,you have to install AEM on that server.we can do it, it is optional and out of box.[But by default AEM comes with the APP server CQSE].
Note:These are called Portal implementations, where we integrate application server ,that is [AEM+Application server].
[for this we have to request the war file,in order to install AEM].
Please go through the Adobe.
——————————————————————————————————————————————————————
OSGI  is a dynamic software component system for JAVA.In an OSGI based system an application is composed of an assemblage of components called bundles in OSGI terminology which can be dynamically installed, started, stopped and uninstalled at runtime without shutting down and restarting the entire application.
——————————————————————————————————————————————————————
example:In regular java application ,had a existing website ,if i want to add new functionality, we need to change the code and deploy on my app server.
But if we use OSGI framework (it is also a java framework),you can a build a small functionality (like a bundle)  and each bundle you can stop and start it, with out stopping the application.so that is the benefit.
——————————————————————————————————————————————————————
the console that is the 
localhost:4506/system/console/bundles
this is nothing but the apache felix or OSGI console.
if you want to stop anything we can stop it for email bundle.that does not effect the application, only that major functionality get stopped.
—————————————————————————————————————————————————————
In AEM the data layer is the content repository
All the data within AEM is stored in the built-in CRX content repository, which is an implementation of the Java Content Repository specification (JCR).
(In the past the name is JCR and at present they improved and they are mentioning as CRX).
The repository built into AEM is called CRX.
CRX is Adobe’s implementation of the Content Repository Specification for Java Technology 2.0,an official Standard published through the JAVA community process as JSR-238 
(version 1.0 was known as JSR-170).
JCR is useful in the file system (read,write,hierarches,looking,streams,access control)
JCR is used in database (integrity,tx,structure,query)
JCR is used in the content repository (multivalue, unstructured, full-text,sort order, observation, versioning ).
In this JCR you will get all the functionality. 
JCR structure content is stored in the form of  node and property ,it is similar to the database column and rows.
How and where the data is stored ??
localhost:4506/crx/de/index.jsp#/apps
this is where the data is stored.this is basically the developer tool.
All the AEM shipping code,AEM functionality  will be under the libs node.
they are different types of the node, each and everything will have their own node symbols.
Under the home node we have the groups, rep policy and users.
whatever your planning to update/the custom code, will come under the  apps node.(apps all the customized level project code).
under the etc node, you will have the config files and related information.
every node explaination is in the screenshot.
Note: u supposed to not update any code in the lib node, it should be done under the apps node.
Under which folder the content is created??
all your website pages and contents will be under the content folder.
only the system generated will be under the var node.
when you create a node ,under type you will have namespace like nt,cq.if we want we can create our own namespace also.

——————————————————————————————————————————————————

DAY CQ(Communique)

DAY CQ(Communique)
AEM 6.1- Version 5.6 onwards is called AEM
2 kinds of modes 
1)Author
2)Publish

Server naming 
Cq-<Run-Mode>-p<portnumber>.jar
Cq-author-p4502.jar
Cq-publish-p4503.jar
Author instances run on even number ports (4504,4506,4508..)
It is possible to have multiple instances running on a single machine
An author instanes requires approximately close to 3 GB – 8 GB RAMS recommended
AEM infrastructure 2 ways
1)On premise – admin , Initial setup,Deploy,monitor the production env
2)AMS(Adobe managed  services) 

To access any url in AEM
http://<servername>:<portnumber>/ -  Login page
Pre-requisites for AEM startup
1)JDK 1.7 or higher running – SET JAVA_HOME and path variables
2)4 gb of ram
=======================================
Cq-publish-p4503.jar
3 ways of starting server
1)1st Way of startin server - Double click the jar file
CRX-quick start folder gets generated
  • - Jetty webserver 
5.6.1and older versions – CQSE(Cq servlet engines)
)2nd way of starting server –  During startup if you want to allocate the heap memory
To extract the jar by commandline
Java –jar cq-author-p4502.jar
-Xms or -XmX (Minum and maximum heap size)
java -XX:MaxPermSize=256m -Xmx1024M -jar cq-author-p4502.jar
-XMs: Minimum heap size
-XmX- Maximum heap size
Permanent generation (Permgen)-
Which holds informations about all the classes,methods,objects in your JVM classloader

My AEM is starting because there are 400 odd OSGI bundles that get added into the container and these bundles go into the active state
AEM uses log 4 framework for logging
  • - LOG4j – WARN,INFO,ERROR,DEBUG
TroubleShooting the Instance
  1. 1) http://localhost:4502/system/console - Felix - Ensure all bundles in active state
First time server start up takes time – 3 mins
        2)Go the crx-quickstart/Logs and inspect error.logs,stderr.logs and Stdout.logs
To view the bundless
OSGI is the specification
Apache felix is the implementation of OSGI that AEM uses
Bundle is a jar +metadata

3)Go to CRX-Quickstart folder, 
  - Bin - Start and stop batch scripts
  - You can start in 3rd way Only if you have started the server in the 1s or 2nd way for the first time
When AEM starts, Automatically a web server is getting started in the backend(Apache JETTY) – 6 Onwards
Which was web server was getting started in AEM 5.6.1 and older – CQSE(Cq Servlet engine)

Its also possible to deploy AEM on top of an existing APP server.

It is also Possible to deploy AEM on a running application server
AEM distribution -WAR file
https://docs.adobe.com/docs/en/cq/5-6/howto/install_application_server.html
==================================================================================
ARCHITECTURE/Technology stack of AEM
1)Storage-
JCR(java content repository)
Hierarchical based storage model
Data is stored in the form of nodes and properties
(/) Top most node in your hierarchy
  JCR is a specification(JSR 283 spec)
Every node has its associated properties where every property is a key/value pair
There are different types of nodes in JCR
AEM uses 2 implementations of JCR 
1)Apache jackrabbit OAK and
2)Adobe’s implementation – CRX(Content repository extreme)
To browse the repository
http://<servername>:<portnumber/crx/de - Lightweight way of accessing crx
http://<servername>:<port number>/crx/explorer

Every node is identified by a property called jcr:primary type which is a mandatory property
Whenever we have a cq:page its child has to be jcr:content

What are the features of  over DBMS/advtgs of jcr
1)Versioning
2)Searching
3)Indexing (/oak:index)
4)User permissoning
5)Observation  I want to observe my node, the moment a node changes I want a java piece of code to get executed Trigger

http://<servername>:<portnumber/
In our case http://localhost:4502/
There are 2 kinds of views in AEM
1)Classic mode or developer mode- Index page - http://localhost:4502/welcome.html  
Classic view of a page
http://localhost:4502/cf#/content/geometrixx/en.html
Intial versions- 5.5,5.6.1
2)Touch UI - Responsive framework for authors – Index page
Touch Ui mode for a page
http://localhost:4502/editor.html/content/geometrixx/en.html

My development remains same for components – I need to create separate dialogs and separate dialogs for classic Ui

AEM architecture
Data storage
1)No concept of database
2)Hierarchical model for storage
ROOT NODE(/)
      Child nodes
JCR  Java content repository (Specification)  - JSR283
– Interface(Set of rules)
Data is stored in the form of nodes and properties
Every node has associated properties
A property is a key value pair – Property has a data type
Which implementation of JCR does AEM USE?
      Apache Jackrabit OAK and
      Adobes’s implementation of JCR CRX(Content Repository extreme)

How do I explore the repository
Everything is a node in JCR
My Entire website is based on the nodes and properties
Everything is a node in JCR

APACHE SLING 
Is a rest based protocol to access the JCR over the web
Is used to Webify the content

OSGI(Open service gateway initiative) - Specification
JAVA CODE –
Modular programming approach
My Application can be divided into modules or Bundles

What is a bundle?
JAR(collection of compiled classes,interfaces and so ) + Metadata
Apache Felix – Implementation of OSGI

http://<ServerName>:<Portnumber>/

1)Every bundle has its own lifecycle( It has its own class loader)
This is what enables every bundle to be started/stopped?
OSGI support multiple of a versions to be deployed on a container


There are 2 kinds of views in AEM
1)CLASSIC UI ( Legacy view) – Non responsive ( Light green backgrounds)
http://localhost:4502/cf#/content/geometrixx/en.html
EXT JS framework (Sencha)

2)TOUCH UI – 5.6.1 onwards
http://localhost:4502/projects.html
Responsive framework for authors
CORAL UI 

A common look and feel across all the Adobe marketing cloud solutions