Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

VI. Linux enterprise YUM software management

2025-02-23 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Database >

Share

Shulou(Shulou.com)06/01 Report--

I. installation of software packages

Programmers first develop software through development tools, initially called source code package, which can be understood by people. It is then compiled into binary software that the machine can understand. Rpm is a set of software management tools developed by Red Hat, which is suitable for automatic installation of software. Including the storage location of the software, library files, header files, configuration files, dependencies between files and other relationship management work.

1. Components of the software package

Secondary system program:

Installation location: / bin / sbin, / usr/bin, / usr/sbin, / usr/local/bin, / usr/local/sbin.

Library files: can also be executable programs, can be called by other programs. In development, it is often called a function, and the more common functions (library files), the stronger the adaptability of the package and the smaller the package.

Installation location: / lib, / usr/lib, / usr/local/lib

Configuration file: / etc/

Help file / manual: / usr/share/doc/

2. Software package management tool (rpm):

List of documents

File placement path

Functional description provided

Dependency relationship

3. Rpm:package manager package manager

With the functions: packaging, installation, query, uninstall, upgrade, check.

Packaging: compiling the source code into a software package that can be installed and executed.

4. The environment on which the compilation package depends:

4.1Compiler: gcc,g++

To provide a compilation environment, you usually need to specify the path to the binary file and the path to the library file

4.2Library: / etc/ld.so.conf, / etc/ld.so.conf.d/*.conf

4.3Manual path: / etc/man.config. Man-M

4.4 header files: coordinate each file. Default: / usr/include.

The compilation process needs to collect the library files needed for compilation, and if the library files are not sound, the compilation will not succeed.

5. The type of program installation:

1. General secondary format (similar to green software, used directly after decompression)

2. Package Manager rpm

3. Source code compilation

Knowledge: the fundamental reason for java to achieve cross-platform is that java has a virtual machine jvm, but this jvm has system platform requirements, and its above java programs can be run, thus solving the cross-platform problem.

6. Naming convention of RPM package

Source program naming: major.minor.release.tar.gz (bz2/xz)

The main version number. The second edition number. The number of modifications. Applicable platform. Applicable to CPU type .tar. Compressed format

Rpm package naming: name-version-release.arch.rpm

Release number: the release number used to indicate rpm compilation.

El6:redhat 6 or above

El5:redhat 5

Above suse11:suse11 version

Arch: host platform

Cpu,32 bits above i686:p2

X86-64:64 bit

Amd64:debian 64 bit

Ppc

Noarch: no platform restrictions

Rpm subcontracting: divide a large software package into multiple packages according to function, so you need to install the main package first and the subpackage according to the situation during the installation process. (bind and bind_devel)

7. Verification of rpm software package

Rpm package verification mechanism: can verify the legitimacy of the source, the integrity of the package.

After the system is installed, the official public key will be placed here in the / etc/pki/rpm-gpg/ directory. To verify that the rpm package downloaded from the network is real and reliable, you need to import the public key with the command, and then verify it.

Find the public key

Locate GPG-KEY

1. Import the public key

Rpm--import / etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

2. Verify the validity of the software package.

[root@localhost] # rpm-K zsh-4.3.10-7.el6.i686.rpm

Zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK

II. RPM command

1. Parameters:

-K: check the integrity and validity of rpm packets. Default

-- nodigest: integrity is not checked

-- no signature: do not check validity

-- install,-I: install

-v: displays details.

-h: displays the progress bar

-- nodeps: ignore dependencies, installation may not be available.

-- test: test the installation

-- prefix: specify a new installation path

2. Uninstall

-- replacepkgs: reinstall the package

-e: uninstall packages-- nodeps is available without uninstalling dependent packages

During uninstallation and reinstallation, if you have previously made changes to the configuration file of the software, linux will save a copy of the modified file on the original path and rename it to ensure the integrity of the user profile.

[root@localhost] ~ # rpm-e zsh

Warning: / etc/zlogin saved as / etc/zlogin.rpmsave

3. Query

-Q,-- query: query whether the package information is installed.

-qi: view package details

-qa: query the summary of all installed rpm software (qi order cannot be reversed)

-qd: query the installation path of the rpm package's help documentation

-ql: query the files contained in the specified software package (list)

-qc: displays only the configuration files of the rpm package

-qf: query the software to which the specified file belongs

-qR: query software dependencies

4. Query the scripts related to rpm package:

Rpm-Q-- scripts

Perinstall: pre-installation script

Postinstall: post-installation script

Preuninstall: pre-uninstall script

Postunstaill: script after uninstall

5. Query the information about uninstalled packages:

Rpm-qp (I, l, d, c) rpm package name

6. Upgrade

-U: install without installation, update if installed

-F: update only, do not install.

-Uvh or-Fvh

Note: the kernel should not be upgraded, but should be installed. The kernel itself allows multiple versions of the kernel.

7. Checksum digital certificate

-V: verify that information such as the installed package configuration file has been modified.

-Va: lists the files in which all installed software in the system has been changed

-Vp: add a file to show the files that may be changed by the software to which you belong.

-Vf: list whether the file has been altered

[root@client ~] # rpm-VaS.5....T. C / etc/login.defs.T. C / etc/inittab.T. C / etc/rc.d/rc.local file type c (config): indicates configuration file d (document): document l (license): authorization file r (readme): readme file properties: s (size): whether the capacity size of the file has been changed M (modediffers): file type, Whether the attribute change 5:md5 has changed D (device): device's primary and secondary number change L (link): link path change U (user): file owner change G (group): file group change T (time): file creation time change

III. RPM database

The dependency relationship between rpm software is saved through a database. Every time yum installs the software, it will synchronize the database information from the yum repository and save it in the / var/lib/rpm/ directory, which is related to the normal use of rpm software.

If damage occurs, it needs to be rebuilt:

-- initdb: initializes the database. The original database will not be overwritten

-- rebuilddb: rebuild the rpm database.

4. YUM command

1. Query

List: used to display related packages (all, installed, available)

Yum list all bind*: displays all bind* packages installed in the repository and for installation

Repolist: displays available repositories (all, enable, disabled)

Info: view package installation and details.

Grouplist: software groups available and installed

Groupinfo "group-name": displays package group content and information

Clean the cache (clean up information about installed software and package groups, installation packages downloaded from the server)

Clean: clear cache (packages, metadata)

Makecache: set up cache manually

2. Installation

Install: installation

Groupinstall: install the package group

Reintall: reinstall

Info: displays the details of the specified software package

List: lists all software managed by the yum repository (including those that are not installed)

Update: package upgrade. Do not specify all package upgrades.

Update-to: upgrade to the specified version.

Check-update: check the latest version of the software package that can be upgraded

(upgrade and upgrade-to are abandoned)

3. Uninstall

Remove: by default, the package on which the uninstalled package depends will be uninstalled together, which should be noted.

Clean up the download file:

Cache location: / var/cache/yum

Cleanup parameter: clean

Packages: delete downloaded software packages

Headers: delete software file headers, similar to index lists

Metadata: delete yum warehouse information.

4. The software package to which the file belongs

Provides: the query specifies that the file is generated by that package.

Search: fuzzy match query command to find all files that contain incomplete file names.

5. Install the package group

Install the package groups that the development environment depends on:

Development Tools

Server Platform Development

Desktop Platform Development

Installation and update of software package group

Groupinstall 、 groupupdate 、 groupremove

Fifth, the establishment of YUM warehouse

Createrepo: create a program repository.

Yum repositories are usually provided by large companies on the Internet, so all we need to do is create a configuration file locally and point the yum source somewhere. Of course, you can also create your own local yum repository. Database files are usually stored in the / var/lib directory by default.

1. Yum source configuration file

/ etc/yum.repos.d/*.repo

[base]

Name=CentOS-$releasever-Base

Mirrorlist= http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

# baseurl= http://mirror.centos.org/centos/$releasever/os/$basearch/ # # YumSource

Gpgcheck=1

Gpgkey= file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Cost=100

[gongbing]

Name= centos 6

Baseurl= file:///media/cdrom/

Enable=1

Gpgcheck=0

Cost=200 cost is used to define the priority of yum sources, and local priority usually takes precedence over other sources

Example: create a third-party warehouse in epel. It is recommended that more third-party repositories will cause conflicts.

[epel]

Name=epel

Mirrorlist= http://mirrors.fedoraproject.org/mirrorlist?repo=epel-$releasever&arch=$basearch

Enabled=1

Gpcheck=0

# wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6 # download the public key of epel repo

Flexible application of yum feeds (for centos official website yum feeds) baseurl:baseurl= http://mirror.centos.org/centos/$releasever/centosplus/$basearch/

$releasever: displays the current release, such as 5, 6, 7, while 6 points to the latest 6.7 directory on the site.

$basearch: displays the platform version of the system, x86tech, 686, 686, and 64.

Practice writing a linux-yum source for 163s

Baseurl= http://mirrors.163.com/centos/$releasever/os/$basearch/

2. Local installation

The yum command also supports installing the rpm package on disk, and the advantage over the rpm command is that the dependency package can be downloaded and installed from the yum repository of the Internet based on the dependency of this rpm package.

For previous yum of linux5, if you install a local yum source, you can use parameters: localinstall, localupdate. After 6, linux is unified to use install to complete.

History:

History: view historical actions.

-- nogpgcheck: do not check package integrity and reliability.

3. Create your own yum repository

It is very easy to create, and you don't need all kinds of parameters.

Install the commands needed to create the YUM repository-createrepo

[root@37-test grub] # yum install createrepo

3.2. to create a yum repository, you need to create and specify a directory

[root@37-test pkg] # createrepo / root/lnmp-setup-bin/pkg/

Spawning worker 0 with 1 pkgs

Workers Finished

Gathering worker results

Saving Primary metadata

Saving file lists metadata

Saving other metadata

Generating sqlite DBs

Sqlite DBs complete

After the creation of the warehouse is completed, the repodata directory is automatically generated in the directory.

[root@37-test pkg] # ls

Dtedu.tar.gz repodata setup.tar.gz

Puppetlabs-release-6-7.noarch.rpm scripts.tar.gz

[root@37-test pkg] #

Generate a repodata folder in the folder, which includes

Filelists.sqlite.gz (file list of rpm packages, engine sqlite)

Filelists.xml.gz (file list of rpm packages, engine xml)

Primary.sql.gzprimary.xml.gz (dependencies between packages)

Other.xml.gz (other information of the rpm package, such as new and improved features)

Other.sqlite.bz2rpm (package other information, such as new and improved features)

Repomd.xml file (record the timestamp of the database for synchronization between the client and the server)

[root@37-test repodata] # ls

53d2a531435469b1468bcb0f4a9a92b91383c47d2c2532a0c659294fa5ae386c-other.sqlite.bz2

817d1464cbb2750d478cb792fc94b20b2bacbd842a031e7e31425f6e64d8996f-filelists.sqlite.bz2

8e54eef08b1deb052bb3b51ac28a5eb63492594a2789855ac1923315757de807-primary.xml.gz

96c0b7b52aff973e1a816d2e24af178dd775b68f71943a09c71827283716464c-primary.sqlite.bz2

Ae3f2e69e30ddf499c40bce4183d2770b366adad39f629d047de0d2366a642b8-filelists.xml.gz

F0053afeca4af6335a88a07891be2547c9d6583f127435d77d4027d39eb8b43d-other.xml.gz

Repomd.xml

3.5.The client configures the local yum repository

[localrepo]

Name=pkg

Baseurl= file:///root/lnmp-setup-bin/pkg/

Enable=1

Gpgcheck=0

[root@37-test repodata] # yum repolist

Loaded plug-ins: fastestmirror, refresh-packagekit

Loading mirror speeds from cached hostfile

* base: mirror.bit.edu.cn

* epel: mirrors.tuna.tsinghua.edu.cn

* extras: mirror.bit.edu.cn

* updates: mirror.bit.edu.cn

Localrepo | 2.9 kB 00:00...

Localrepo/primary_db | 1.9 kB 00:00...

Warehouse identifies warehouse name status

Base CentOS-6-Base 6696

Epel Extra Packages for Enterprise Linux 6-x86 million 64 12150

Extras CentOS-6-Extras 62

Localrepo pkg 1

Ntop ntop packages 6

Ntop-noarch ntop packages 9

Puppetlabs-deps Puppet Labs Dependencies El 6-x86 million 64 77

Puppetlabs-products Puppet Labs Products El 6-x86 "64 565"

Saltstack-zeromq4 Copr repo for zeromq4 owned by saltstack 8

Updates CentOS-6-Updates 686

Repolist: 20260

3.6.The yum client generates a yum repository database locally:

[root@37-test repodata] # ll / var/lib/yum/repos/x86_64/6/

Total dosage 40

Drwxr-xr-x. 2 root root 4096 August 26 2012 base

Drwxr-xr-x 2 root root 4096 October 14 10:42 epel

Drwxr-xr-x. 2 root root 4096 August 26 2012 extras

Drwxr-xr-x 2 root root 4096 December 8 09:16 gongbing

Drwxr-xr-x 2 root root 4096 November 21 14:40 ntop

Drwxr-xr-x 2 root root 4096 November 21 14:40 ntop-noarch

Drwxr-xr-x. 2 root root 4096 August 26 2012 puppetlabs-deps

Drwxr-xr-x. 2 root root 4096 August 26 2012 puppetlabs-products

Drwxr-xr-x 2 root root 4096 November 22 11:30 saltstack-zeromq4

Drwxr-xr-x. 2 root root 4096 August 26 2012 updates

Supplement: LFTP

Get: file download

Mget: multiple file downloads

Mirror: download directories and files

! Command: using the linux command

VI. Compile the source code:

Compiling source code first requires a compilation environment to compile the source code, and then uses the make command for the compilation tool, which is compiled according to makefile, so where does makefile come from? It generates makefile files through configure scripts and makefile.in.

1. Depending on the environment, the development package group is required.

Install the package groups that the development environment depends on:

Development Tools

Server Platform Development

Desktop Platform Development

[root@37-test ~] # yum groupinfo "development tools"

Loaded plug-ins: fastestmirror, refresh-packagekit

Set up the group process

Loading mirror speeds from cached hostfile

* base: mirrors.tuna.tsinghua.edu.cn

* epel: mirrors.tuna.tsinghua.edu.cn

* extras: mirror.bit.edu.cn

* updates: mirror.bit.edu.cn

Roups: development tools

Description: basic development environment.

Necessary software packages:

Autoconf

Automake

Binutils

Bison

Flex

Gcc

Gcc-c++

Gettext

Libtool

Make

Patch

Pkgconfig

Redhat-rpm-config

Rpm-build

Default package:

Byacc

Cscope

Ctags

Cvs

Diffstat

Doxygen

Elfutils

Gcc-gfortran

Git

Indent

Intltool

Patchutils

Rcs

Subversion

Swig

Systemtap

Optional software packages:

ElectricFence

PyYAML

Ant

Babel

Bzr

Ccache

Chrpath

Clips

Clips-devel

Clips-doc

Clips-emacs

Clips-xclips

Clipsmm-devel

Clipsmm-doc

Cmake

Cmucl

Colordiff

Compat-gcc-34

Compat-gcc-34-c++

Compat-gcc-34-g77

Cvs-inetd

Cvsps

Darcs

Dejagnu

Email2trac

Expect

Ftnchek

Gcc-gnat

Gcc-java

Gcc-objc

Gcc-objc++

Ghc

Git

Haskell-platform

Imake

Jpackage-utils

Kdewebdev

Ksc

Libstdc++-docs

Lua

Mercurial

Mock

Mod_dav_svn

Nasm

Nqc

Nqc-doc

Ocaml

Perltidy

Python-docs

Python-requests

Python-six

Qgit

Rpmdevtools

Rpmlint

Sbcl

Systemtap-sdt-devel

Systemtap-server

Trac

Trac-git-plugin

Trac-mercurial-plugin

Trac-webadmin

Translate-toolkit

2. Compile and install the source package

2.1 decompress the source code packet

[root@37-test] # tar zxvf ntopng-2.4-stable.tar.gz-C / root/test/

-C: used to specify which directory to extract.

2.2 enter the source code directory

2.2.1, configure the source code .configure, the function is to detect the compilation environment, this file generally exists in the package, if not can be generated through autoconf.

Custom compilation variables:

-- help: get help information-- prefix= specify installation path-- sysconfdir= specify configuration file path

After setting up / configure, config.log and makefile files are automatically generated.

[root@37-test ntopng-2.4-stable] # ls

Autogen.sh configure doc Makefile.in scripts

Autom4te.cache configure.ac docker nDPI src

CHANGELOG.md configure.seed httpdocs ntopng.8 third-party

Config.guess contrib include packages tmp

Config.log COPYING LICENSE README.md tools

2.2.2, .configure is combined with makefile.in to generate makfile,makefile.in through automake.

2.2.3, compile the source code

Makemake install

3. Perfect compilation and installation

The biggest difference between compiler installation and rpm installation is that rpm installation has a database. After installation, the system knows that executable programs, library files, help documents and configuration files are all there and can be found on their own. The compilation installation does not provide this feature and needs to be developed manually.

3.1Defining global environment variables for path

[root@37-test ~] # PATH=/usr/local/nagios/bin/:$PATH # # variables defined by the command are temporary.

Modify / etc/profile or create a / etc/profile.d/nagios.sh file.

[root@37-test ~] # vi / etc/profile.d/nagios.sh

Export PATH=/usr/local/nagios/bin/:$PATH

Effective immediately:

[root@37-test] #. / etc/profile.d/nagios.sh

Add the library file that the compiled software depends on. This library file is usually located in the lib directory in the installation directory of the compiled software package, which can be set through / etc/ld.so.conf, or it is recommended to create a * .conf file under the / etc/ld.so.conf.d/ directory.

[root@37-test ~] # vi / etc/ld.so.conf.d/nagios.conf

/ usr/local/nagios/lib/ # # add a path

3.3 configuration files usually do not need to be added manually, and compiled software can be found on its own.

3.4.The addition of help files needs to be configured through the / etc/man.config file and added at MANPATH=.

# Every automatically generated MANPATH includes these fields

#

MANPATH / usr/man

MANPATH / usr/share/man

MANPATH / usr/local/man

MANPATH / usr/local/share/man

MANPATH / usr/X11R6/man

MANPATH / usr/local/nagios/share/ add path

#

# Uncomment if you want to include one of these by default

#

# MANPATH / opt/*/man

# MANPATH / usr/lib/*/man

# MANPATH / usr/share/*/man

Add header files and use ln-s to create a soft connection to the system header directory / etc/include/.

[root@37-test ~] # ln-sv / usr/local/nagios/include/ / usr/include/nagios

"/ usr/include/nagios"-> "/ usr/local/nagios/include/"

[root@mail ~] # ln-sv / usr/local/courier-authlib/include/* / usr/include/

"/ usr/include/courier_auth_config.h"-> "/ usr/local/courier-authlib/include/courier_auth_config.h"

"/ usr/include/courierauthdebug.h"-> "/ usr/local/courier-authlib/include/courierauthdebug.h"

"/ usr/include/courierauth.h"-> "/ usr/local/courier-authlib/include/courierauth.h"

"/ usr/include/courierauthsaslclient.h"-> "/ usr/local/courier-authlib/include/courierauthsaslclient.h"

"/ usr/include/courierauthsasl.h"-> "/ usr/local/courier-authlib/include/courierauthsasl.h"

"/ usr/include/courierauthstaticlist.h"-> "/ usr/local/courier-authlib/include/courierauthstaticlist.h"

Knowledge points:

What are the library files on which the command depends? Ldd

[root@37-test ~] # ldd / bin/ls

Linux-vdso.so.1 = > (0x00007fff787b1000)

Libselinux.so.1 = > / lib64/libselinux.so.1 (0x00007fa143af6000)

Librt.so.1 = > / lib64/librt.so.1 (0x00007fa1438ee000)

Libcap.so.2 = > / lib/libcap.so.2 (0x00007fa1436e9000)

Libacl.so.1 = > / lib64/libacl.so.1 (0x00007fa1434e1000)

Libc.so.6 = > / lib64/libc.so.6 (0x00007fa14314d000)

Libdl.so.2 = > / lib64/libdl.so.2 (0x00007fa142f48000)

/ lib64/ld-linux-x86-64.so.2 (0x00007fa143d27000)

Libpthread.so.0 = > / lib64/libpthread.so.0 (0x00007fa142d2b000)

Libattr.so.1 = > / lib64/libattr.so.1 (0x00007fa142b26000)

What is the execution path to run the command? Hash

[root@37-test ~] # hash

Hits command

1 / usr/bin/ldd

1 / usr/local/nagios/bin/nrpe

1 / bin/vi

2 / usr/bin/man

Ldconfig-v

Re-search all library files in the system and generate / etc/ld.so.cache.

[root@37-test] # ldconfig-v

Ldconfig: / etc/ld.so.conf.d/kernel-2.6.32-642.11.1.el6.x86_64.conf:6: duplicate hwcap 1 nosegneg

Ldconfig: unable to stat / usr/lib64/mysql: there is no file or directory

Ldconfig: give the path "/ usr/local/lib" many times

Ldconfig: give the path "/ usr/local/lib" many times

Ldconfig: give the path "/ usr/lib" many times

Ldconfig: give the path "/ usr/lib64" many times

/ opt/glibc/lib:

Libnss_nisplus.so.2-> libnss_nisplus-2.14.so

Ld-linux-x86-64.so.2-> ld-2.14.so

7. Compile rpm package in source code format-SRPM

Packaging (rpm source code package is made into rpm package, the general format is: filename.src.rpm)

The package making process is based on the .spec file.

The source package is compiled and stored in the / usr/src/ directory, and usually leaves only the compiled package in SRPMS after being compiled correctly.

1. Unpack and install the src.rpm package. Some installations need to create a specified user name.

[root@37-test] # rpm-ivh mingetty-1.00-3.src.rpm

Warning: mingetty-1.00-3.src.rpm: Header V3 DSA/SHA1 Signature, key ID db42a60e: NOKEY

1:mingetty # # [100%]

2. Enter the decompressed directory, which is usually in the rpmbuild of the user's home directory.

[root@37-test ~] # cd rpmbuild/S

SOURCES/ SPECS/

[root@37-test SOURCES] # ll

The total dosage is 20

-rw-rw-r--. 1 root root 259 March 4 2002 mingetty-1.00-opt.patch

-rw-rw-r--. 1 root root 14038 March 4 2002 mingetty-1.00.tar.gz

3. Compile the source code rpm package

[root@37-test SPECS] # rpmbuild-bb mingetty.spec

-ba: generate rpm packages in binary and source format

-bb: generate a rpm package in binary format

You may need to rely on the package, which will be recompiled after the package is installed.

[root@37-test rpmbuild] # ll

Total dosage 24

Drwxr-xr-x 3 root root 4096 December 9 14:11 BUILD

Drwxr-xr-x 2 root root 4096 December 9 14:11 BUILDROOT

Drwxr-xr-x 3 root root 4096 December 9 14:11 RPMS

Drwxr-xr-x 2 root root 4096 December 9 14:04 SOURCES

Drwxr-xr-x 2 root root 4096 December 9 14:11 SPECS

Drwxr-xr-x 2 root root 4096 December 9 14:07 SRPMS # # for reprogramming and compiling of other systems

[root@37-test rpmbuild] # cd RPMS/

[root@37-test RPMS] # ls

X86_64

[root@37-test RPMS] # cd x86_64/

[root@37-test x86_64] # ls

Mingetty-1.00-3.x86_64.rpm mingetty-debuginfo-1.00-3.x86_64.rpm

[root@37-test x861464] # rpm-ivh mingetty-debuginfo-1.00-3.x86_64.rpm

Preparing... # [100%]

1:mingetty-debuginfo # # [100%]

Question:

1 、 error: line 4: Unknown tag: Copyright: GPL

This error can be changed from "Copyright:" to a new Tag "License:" by modifying the need in the repc file.

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Database

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report